2015-12-28 40 views
6

テンプレートを学習して実験しているうちに、私は完全に把握できなかったものを見つけました。テンプレート引数はどのように解決/推定されますか?

class sample 
{ 
    public: 
     sample(int a = 0) {} 
}; 

template <typename T1,typename T2> 
void add(T1 a) // Replace T1 with T2 resolves compilation error. 
{} 

int main() 
{ 
    add<sample>(3); 
    return 0; 
} 

上記のコードでは、コンパイルエラー(03とC++ 0xの両方)が発生します。しかし、引数の型をT1からT2に変更すると問題ありません。 nmでは、作成されたプロトタイプはadd(sample、int)[T1 = sample、T2 = int]です。引数の型としてT1を使用し、T2を使用しないとコンパイルが失敗するのはなぜですか?

答えて

6

テンプレート引数を指定するには、明示的にまたは暗黙的に2つの方法があります。

これは、明示的な次のようになります。

template<typename T> 
void do_something(T value) {}; 

do_something<float>(6); // T is float 

これは、暗黙的な次のようになります。あなたの場合

int x; 

do_something(x); // since first argument is T and x is int, T is int 

template <typename T1,typename T2> void add(T1 a); 
add<sample>(3); // T1 is explcitly sample, T2 is unknown 

ケース2:

template <typename T1,typename T2> void add(T2 a); 
add<sample>(3); // T1 is explcitly sample, T2 is implicitly int 
1

sampleクラスをintから暗黙的に作成できるためです。したがって、タイプ引数として<sample>を指定すると、,の暗黙的にの最初のパラメータと一致しますが、T2は、どのタイプにも推論できないため、未定義です。

、あなたは部分的に型を指定するので、これは、後者の場合には発生しません:<sample>T1の種類を指定し、intはその後T2のために推定することができ、テンプレートの種類はすべて推定されます。すべてのタイプが使用されなくても、これは問題ありません。

関連する問題