2011-11-10 31 views
4

私はテンプレートの特殊化を理解しようとしています。なぜこれが発生するエラー(specialization of 'T foo(T, T) [with T = int]' after instantiationC++でのテンプレートの特殊化

template <class T> T foo(T a, T b); 

int main() 
{ 
    int x=34, y=54; 
    cout<<foo(x, y); 
} 

template <class T> T foo(T a, T b) 
{ 
    return a+b; 
} 

template <> int foo<int>(int a, int b) 
{ 
    cout<<"int specialization"; 
} 
+1

ちょうどmain' '前に定義を移動します。 –

+1

私のアンドロイドの電話で質問を読むと、雨が降っているが、時間がたっても答えることができない。HURTS –

+1

@ JohannesSchaub-litbあなたは中毒です!助けを求める;) –

答えて

8

標準要求。さもなければあなたのプログラムは不正な形式です(実際には診断は必要ありません)。

(だから、この問題を解決するには、単にプログラムの先頭にすべてテンプレート定義を置く。)

ちょうどテンプレート、テンプレート関数が機能していないことに注意してください。それらをコード生成ツールと考えてください。

3

明示的特殊テンプレート機能が/インスタンス化と呼ぶことができる前に、foo()が可視であるべきです。

実際、上記のルールはすべてのテンプレート関数に適用されます。

ソリューション:
あなたmain()foo()用テンプレートの特殊化を移動します。

うまく動作するはずです後:すべてのテンプレート定義がインスタンス化の時点で知られており、すべての翻訳単位が同一の定義を参照してくださいことしなければならない

template <class T> T foo(T a, T b); 

/*Should be visible before instantiation*/ 
template <> int foo<int>(int a, int b) 
{ 
    cout<<"int specialization"; 
} 

int main() 
{ 
    int x=34, y=54; 
    cout<<foo(x, y); 
} 

template <class T> T foo(T a, T b) 
{ 
    return a+b; 
} 
0

しないでください。

を使用すると、機能の基本テンプレートを書いている場合は、専門ませんか がオーバーロードすることは絶対に避けてください 単機能のテンプレートとしてそれを書き、その後、関数テンプレートを実装することを好む:ハーブサッターが言っ

静的関数を含むクラステンプレートへの単純なハンドオフとして、完全に同一の署名 を持つ。

参照:http://www.gotw.ca/publications/mill17.htm

関連する問題