3

只是想知道为什么这不能编译。我认为编译器可以推断参数化结构的类型?

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[])
4

1 回答 1

8

表格代码:

auto arr = Arr([1,2,3]);

Arr是对when Arris a的构造函数的调用struct。在这种情况下,没有显式构造函数。如果有,它可能已经被模板化,并且参数推断确实适用于模板化构造函数。由于没有构造函数,参数将用于Arr按照声明的顺序初始化字段。但是,当然,Arr它是一个模板,所以要构造的类型还不知道。

如果您认为这种情况应该有参数推断,请考虑以下几点:

struct Arr(T)
{
    static if(is(T == bool))
        BitArray data;
    else
        T[] data;
}

在上面的例子中,在模板实例化之前,字段的类型(也可能是顺序)是未知的……那么它会如何推断呢?

模板必须显式实例化:

auto arr = Arr!int([1, 2, 3]);
于 2012-10-31T04:41:38.533 回答