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

[戻る]
筋肉先生 2006/01/01(日) 20:25:05
C++での,テンプレートの特殊化に関する質問です.
テンプレートの引数が複数あるときの特殊化が良く分かりません.具体的には...

template<typename T1, typename T2>
class Hoge
{
 const T1& x_;
 const T2& y_;

public:
 Hoge(const T1& x, const T2& y)
  : x_( x )
  , y_( y )
 {}

 void hoge(){ std::cout << "default" << std::endl; }
};

のようなテンプレートクラスHogeで,
1. T1のみがintのとき
2. T2のみがintのとき
3. T1とT2ともにintのとき
の3つの場合について,メンバ関数hogeの動作を変えたいのですが,

// 1.の場合
template<typename T2>
void Hoge<int, T2>::hoge(){ std::cout << "T1のみint" << std::endl; }

//2.の場合
template<typename T1>
void Hoge<T1, int>::hoge(){ std::cout << "T2のみint" << std::endl; }

//3.の場合
template<>
void Hoge<int, int>::hoge(){ std::cout << "T1とT2ともにint" << std::endl; }

とやると,うまくいきません.どうすればいいのでしょう?
多分,単なる文法のミスっぽい希ガス.
誰かダメだししてくれませんか?

DD. 2006/01/01(日) 22:41:39
「Modern C++ Design」からの引用です。
・テンプレート・パラメータを複数指定したテンプレートにおけるメンバ関数群を特殊化
す ることはできません。

例)
template < class T, class U > class Gadget
{
  void Fun() { ... }
};
template < class U > void Gadget< char, U >::Fun() {} // 特殊化できない

まさにこれに当たるかと。

筋肉先生 2006/01/01(日) 22:57:01
[[解決]]
あちゃー.まじっすか...

まぁ,不可能だということが分かってよかったです.
他のアプローチを考えます.
DDさん,ありがとうございました.

# 私もModern C++ Designは所有していますが,自分にはまだ難解で,まだそこまで読め
てません.つぅか,7ページにあるよ...orz

これは標準C++の仕様なんですかねぇ.
それとも,今後サポートしたコンパイラは出てくるんでしょうか.

古いスレッドには追加発言できません。