2010-11-19 10 views
4

クラス定義:template宣言クラスメソッド定義構文

template<class K, class V, 
     unsigned hashFunc(const K&), 
     int compFunc(const K&,const K&)=&_compFunc<K> > class X {}; 

私はクラスのコードブロックの外でクラスメソッドを定義したいです。以下のようなので:コンパイラは不平を言っているのはなぜ

template<class K, class V, 
     unsigned hashFunc(const K&), 
     int compFunc(const K&,const K&)=&_compFunc<K> > 
X<K, V, hashFunc, compFunc>::X() { } 

グラム++ v.4.4.3は

error: default argument for template parameter for class enclosing ‘X::X()’

を返し、私はそれがどのように動作するかを作ることができますか?

ジョンDiblingで指摘したように
template<class K, class V, 
     unsigned hashFunc(const K&), 
     int compFunc(const K&,const K&)> 
X<K, V, hashFunc, compFunc>::X() { /* ... */ } 

は、クラスXは明らかにもコンストラクタを宣言しなければなりませんが、私は、コードをわかりやすくするために削除されたと仮定:

答えて

5

Xのコンストラクタを宣言または定義していません。また、試行したX :: X定義でデフォルトのテンプレートパラメータを繰り返していました。ここで

が固定コードだ、 mainは-ified:

template<class K, class V, 
     unsigned hashFunc(const K&), 
     int compFunc(const K&,const K&)=&_compFunc<K> > 
class X 
{ 
    X(); 
}; 

template<class K, class V, 
     unsigned hashFunc(const K&), 
     int compFunc(const K&,const K&) > 
X<K, V, hashFunc, compFunc>::X() { } 

int main() 
{ 
} 
4

デフォルトのテンプレートパラメータを繰り返すべきではありません。