2011-10-28 19 views
4

私は現在C++の勉強をしていますが、今は数時間困ったことがあります。 テンプレートを作成して特殊化すると、特殊なバージョンの関数を呼び出せない、または定義できないのはなぜですか?コンパイラは文句を言って、私が間違っていることについてヒントを探すためにGoogleを精査したが、役に立たない。私はそれが私が見渡せるだということを非常に単純なもので非常に確信しています:特殊なテンプレートのC++関数の定義と呼び出し

template <typename T> 
class C { }; 

//specialization to type char 
template <> 
class C <char> 
{ 
    public: 
    void echo(); 
}; 

//compiler complains here 
template <> 
void C <char> :: echo() 
{ 
    cout << "HERE" << endl; 
} 

error: template-id ‘echo<>’ for ‘void C::echo()’ does not match any template declaration

Demo

+0

[template-idはテンプレートのdelcarationと一致しません](http://stackoverflow.com/questions/4694181/template-id-does-not-match-any-template-delcaration) – GWW

答えて

7
//specialization to type char 
template <> 
class C <char> 
{ 
    public: 
    void echo(); 
}; 

//template<> <----- don't need to mention template<> here 
void C <char> :: echo() 
{ 
    cout << "HERE\n"; 
} 

p.s. '\n'を意味するときは、endlと言ってはいけません。 What is the C++ iostream endl fiasco?

+1

ありがとう@ロブ!最後の質問ですが、関数 "echo()"にテンプレート指定子が必要ないのはなぜですか? – jrd1

+2

@ jrd1、 'echo()'はそれ自身では 'template'関数ではないからです。これは 'テンプレートクラス'のメンバメソッドです。 – iammilind

+0

@ jrd1、対比[this program](http://ideone.com/ANzxC)。 –

関連する問題