2011-02-09 22 views
13

次のコードは、Xcodeでコンパイルエラー発生:Foo MyFoo(123);Foo<int> MyFoo(123);への修正問題を変更テンプレートの暗黙的パラメータ

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

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

error: missing template arguments before 'MyFoo'

を、しかし、コンパイラが適切に把握できないようにする必要がありデータ・タイプ?

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

Foo MyFoo(123); 

MyFooのための一時的なスペースを割り当てるされ、知るためにMyFooの完全修飾タイプを知っている必要があります。

答えて

11

コンストラクタは、理論的には、それが構築されたオブジェクトが、文の種類を推測することができどのくらいのスペースが必要です。

あなたが特に複雑なテンプレートの名前を(指でIE)のタイピングを避けたい場合は、typedefが使用することを検討してください:持っている

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

またはC++ 0xの中

あなたが autoキーワードを使用することができますコンパイラの使用タイプの推論 - 多くの人が、読みにくく、エラーが発生しやすいコードを作成すると主張しますが、私自身もそうです。 ; P

+5

、それはスペースを推測することができます。 –

+6

コンストラクタの呼び出しの型は推測できますが、記憶域の型は推測できません。変数を単に 'Foo'として定義すると、' Foo 'と' Foo 'の両方を保持できますか?それとも、心の中に秘密に 'Foo 'があるのはいつも知っていますか?変数が 'const'の場合、値を再割り当てできないので実装できますが、' const T'と 'T'の異なる字句規則があり、大きな混乱が起こります。 –

7

コンパイラがないクラス/構造体

+3

結局のところ、クラス 'std :: pair を持っていても、関数std :: make_pair (T t、U u) '。 –

2

それはバグではないため、唯一のテンプレート機能のためのテンプレートパラメータの種類を把握することができ、それが存在しない機能です。インスタンス化の際には、クラス/構造テンプレート引数を完全に指定する必要があります。関数テンプレートの場合と同じように、型は推測されません。

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でこの記事を読む:fooはTがタイプである場合には、だけでなく、Foo<T>クラスであるよう

The C++ Template Argument Deduction

0

それは、それはこのようなものです多くの意味になります。

C++ 0xではautoを使うことができ、Fooを作るための関数を作成してfoo(小文字のf)と呼ぶことができます。そして、あなたがC++ 11では

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

auto myFoo = foo(55); 
+0

「テンプレート Foo foo(T x)」という意味ですか? –

2

を行うだろう、あなたはdecltypeを使用することができます:それは型を推論することができれば

int myint = 123; 
Foo<decltype(myint)> MyFoo(myint); 
関連する問題