只是想知道为什么这不编译。我以为编译器可以推断参数化结构的类型?
void main() {
auto arr = Arr([1,2,3]);
}
struct Arr(T) {
private T[] data;
}
错误:
junk.d(25): Error: struct junk.Arr(T) is not a function template
junk.d(25): Error: struct junk.Arr(T) cannot deduce template function from argument types !()(int[])
答案 0 :(得分:8)
表格代码:
auto arr = Arr([1,2,3]);
是在Arr
为Arr
时调用struct
的构造函数。在这种情况下,没有明确的构造函数。如果存在,它可能已经模板化,参数推断确实适用于模板化构造函数。由于没有构造函数,因此参数将用于按照声明的顺序初始化Arr
的字段。但是,当然,Arr
是一个模板,所以要构造的类型还不知道。
如果您认为此案例应该有参数推断,请考虑以下事项:
struct Arr(T)
{
static if(is(T == bool))
BitArray data;
else
T[] data;
}
在上面的例子中,在实例化模板之前,不知道字段的类型(也可能是顺序)......那么它将如何推断?
必须明确实例化模板:
auto arr = Arr!int([1, 2, 3]);