2009-09-12 14 views
20

次のテンプレート特殊化コード:C++テンプレートの特殊: "明示的なテンプレート引数の不正利用"

template<typename T1, typename T2> 
void spec1() 
{ 

} 

テストケース1:

template< typename T1> //compile error 
void spec1<int>() 
{ 

} 

テストケース2:

template< typename T2> //compile error 
void spec1<int>() 
{ 

} 

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

error C2768: 'spec1' : illegal use of explicit template arguments

誰に通知するのですか?

+0

あなたはどのプラットフォーム/コンパイラを使用していますか? – aaa90210

+0

私はVisual C++ 08を使用しています – jameszhao00

答えて

51

関数テンプレートは、そのような、すなわち、唯一の完全、部分的に専門的なことはできません:関数テンプレートは、部分的に専門的なことはできませんなぜ、あなたはread thisしたいことのために

template<> 
void spec1<char, int>() 
{ 

} 

あなたが部分的に(クラスについてのみ可能)専門、あなたはそのようにそれを行う必要があるだろう:

template <typename T1> 
class class1<T1, int> 
{ 

}; 

は、あなたが再び T1の一覧を表示する必要があります。

特殊化の方法は、spec1<int, int>ではあいまいです。

+3

ああ、私は部分的に特殊なクラスに静的関数を埋め込むことができますか? – jameszhao00

+0

ああ、あなたがリンクしている記事がすでに問題を説明しているのを見ています。私は私の答えを削除しました。私はクラスへの転送がこの場合にはより便利だと分かったからです。関数のパラメータの型として 'T1'と' T2'が使われている場合、通常の関数のオーバーロードと同じように、読み込みがはるかに読みやすくなります。 –

+0

"クラスのためにのみ可能"と読むと、私は気を失った。私はそれがクラスと構造体の両方で可能であることを発見しました;-)。 –

関連する問題