2012-04-21 6 views
4

私はこれを書きたいと思います:VS10はコンパイルに失敗しクラスのテンプレート引数に応じてテンプレートメンバー関数を特殊化する方法は?

template<typename T1, typename T2> 
class OK 
{ 
    T1 t1; 
    T2 t2; 

public: 
    template<typename TX> const TX & GetRef() const; 
}; 

template<typename T1,typename T2> 
template<> 
const T1 & OK<T1,T2>::GetRef<T1>() const { return t1; } 

template<typename T1,typename T2> 
template<> 
const T2 & OK<T1,T2>::GetRef<T2>() const { return t2; } 

は、テンプレートの特殊化の私の理解を確認するには、私が試したし、これがすべての権利コンパイル:

typedef int T1; 
typedef char T2; 
class OK 
{ 
    T1 t1; 
    T2 t2; 

public: 
    template<typename TX> const TX & GetRef() const; 
}; 

template<> 
const T1 & OK::GetRef<T1>() const { return t1; } 

template<> 
const T2 & OK::GetRef<T2>() const { return t2; } 

は、私が何をしないのですか?私もできることは可能ですか?

編集:私はすべてのGetRef()と呼ばれる、すべてのフィールドのgetterを持っているしたいと思いますので、ユーザは何か書くことができます:あなたが専門にすることなく、クラステンプレートのメンバーテンプレートを特化することはできません

OK<float,double> ok; 
float a = ok.GetRef<float>(); 
double b = ok.GetRef<double>(); 

答えて

5

をテンプレート。つまり、T1T2がクラステンプレートで修正され、TXが修正されたり、TXを修正できない完全な特殊化を指定することができます。私が見

template<typename T1, typename T2> 
class OK 
{ 
    T1 t1; 
    T2 t2; 
public: 
    const T1& GetRef() const { return t1; } 
    template<typename TX> const TX & GetRef() const; 
}; 
+0

簡単な解決策は、テンプレート関数を特化ではなく、別のオーバーロードを提供することではありません。私はGetRefとも呼ばれるt2のゲッターを提供できないと思います。 – Gabriel

+2

@Gabriel:いいえ...私はあなたが全体的に何をしようとしているのか本当に理解していないと思いますが、なぜ各メンバーを返す2つの異なる機能を提供しないのですか?あなたが望むものがタイプに基づいていずれかのオプションを返す 'GetRef'なら、それを解決するために余分な間接レベルを追加することができます:' template T const&get()const {return get((T *)0 ); }; T1 const&get(T1 *){return t1; } T2 const&get(T2 *){return t2; } '2つの非テンプレート' get'はプライベートになります。 –

+0

ニース!これはトリックです! (あなたは個人的にconstを忘れています。) – Gabriel

関連する問題