struct A{T}
time::Vector{Float64}
data::Vector{T}
end
I would like to initialize an empty object of class A
I tried with outer constructor as below
A() = A([],[])
But it failed:
julia> a = A()
ERROR: MethodError: no method matching A(::Array{Any,1}, ::Array{Any,1})
Closest candidates are:
A(::Array{Float64,1}, ::Array{T,1}) where T at none:3
Stacktrace:
[1] A() at .\none:1
[2] top-level scope at none:0
Thus, I tried to find out how to initialized
A() = A(Array{Float64}[],[])
This is also failed
julia> a = A()
ERROR: MethodError: no method matching A(::Array{Array{Float64,N} where N,1}, ::Array{Any,1})
Closest candidates are:
A(::Array{Float64,1}, ::Array{T,1}) where T at none:3
Stacktrace:
[1] A() at .\none:1
[2] top-level scope at none:0
How should we initialized an emtpy vector of Float64 type?
[] is a vector of Any, but your struct A requires a vector of Float64.
Moreover Array{Float64}[] is a vector of Vector{Float64} (you would have elements such as [[1.0, 2.0], [3.0, 4.0, 5.0]] for instance), which is why your third attempt fails.
Float64[] is also equivalent to Vector{Float64}(undef, 0), which is a vector of Float64 containing 0 elements of random (undef) content.
Note that Vector{Float64}(undef, 0) can be abridged to Vector{Float64}(). Also, to clarify for beginners, “random content” here doesn’t literally mean “random” but uninitialized (so content which might appear random, but is not initialized with random bits – use rand for that).
The error in this case is mostly not because of a vector of Float64 hasn’t been passed, but because the compiler cannot infer type parameter from A([], []).
If you write
A() = A{Any}([], [])
then Julia happily converts the first [] to Float64[].
That said, passing Float64[] as the first argument is better, as it avoids allocating a temporary Any[] just to throw it away.