13

次のコードは、Xcode でコンパイル エラーを生成します。

template <typename T>
struct Foo
{
    Foo(T Value)
    {
    }
};

int main()
{
    Foo MyFoo(123);
    return 0;
}

error: missing template arguments before 'MyFoo'

に変更Foo MyFoo(123);するFoo<int> MyFoo(123);と問題は解決しますが、コンパイラは適切なデータ型を把握できないのでしょうか?

これはコンパイラのバグですか、それとも暗黙のテンプレート パラメータを誤解していますか?

4

7 に答える 7

13

コンストラクターは、理論上、構築しているオブジェクトの型を推測できますが、ステートメントは次のとおりです。

Foo MyFoo(123);

に一時スペースを割り当ててMyFooおり、必要なスペースの量を知るために の完全修飾型MyFooを知る必要があります。

特に複雑なテンプレートの名前を入力 (つまり、指で) したくない場合は、次の使用を検討してtypedefください。

typedef std::map<int, std::string> StringMap;

または、C++0x では、autoキーワードを使用してコンパイラに型推論を使用させることもできますが、多くの人は、コードが読みにくくなり、エラーが発生しやすくなると主張するでしょう。;p

于 2011-02-09T16:02:29.150 に答える
8

コンパイラは、クラス/構造体ではなく、テンプレート化された関数に対してのみテンプレート パラメーターの型を把握できます

于 2011-02-09T16:02:34.477 に答える
2

C++11 では、以下を使用できますdecltype

int myint = 123;
Foo<decltype(myint)> MyFoo(myint);
于 2015-02-21T03:14:11.080 に答える
2

コンパイラは、次のような場合のテンプレート引数を推測できます。

template<typename T>
void fun(T param)
{
    //code...
}

fun(100);    //T is deduced as int;
fun(100.0);  //T is deduced as double
fun(100.0f); //T is deduced as float

Foo<int> foo(100);
fun(foo);    //T is deduced as Foo<int>;

Foo<char> bar('A');
fun(bar);    //T is deduced as Foo<char>;

実際、テンプレート引数の推定は大きなトピックです。ACCU でこの記事を読んでください。

C++ テンプレート引数の推論

于 2011-02-09T16:12:39.353 に答える
2

これはバグではなく、存在しない機能です。インスタンス化中にクラス/構造テンプレート引数を完全に指定する必要があります。常に、型は関数テンプレートの場合と同様に推測されません。

于 2011-02-09T16:02:56.577 に答える
0

Foo<T>Foo はクラスではなく、T のみが型であるため、このようになっていることは非常に理にかなっています。

C++0x では auto を使用でき、関数を作成して Foo にすることができます。これを foo (小文字の f) と呼びましょう。それならあなたはするだろう

template<typename T> Foo<T> foo(int x)
{
  return Foo<T>(x);
}

auto myFoo = foo(55);
于 2011-02-09T16:41:19.617 に答える