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]);

Arrwhenのコンストラクターの呼び出しArrです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 に答える