テンプレートメンバ関数の特殊化はクラス外で

クラスのメンバ関数をテンプレート関数として作成し,さらにそれを特殊化する場合,特殊化は,特殊化宣言も含めてクラス外で行わなければならないらしい.

NG例

class TTest
{
public:
  template<typename T> T one(void) const {return 1;}
  template<> double one<double>(void) const {return 1.0;} // 特殊化
};

コンパイルすると,

15: error: explicit specialization in non-namespace scope ‘class TTest’
15: error: template-id ‘one<double>’ in declaration of primary template

というエラーが出る(g++-4.4.4 の場合).

OK例

class TTest
{
public:
  template<typename T> T one(void) const {return 1;}
};
template<> double TTest::one<double>(void) const {return 1.0;} // 特殊化

こう書けばOK.