4

私はこれを書きたいと思います:

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; }

どの VS10 がコンパイルに失敗しますか。

テンプレートの特殊化に関する私の理解を確認するために、これを試してコンパイルしました。

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; }

私は何が欠けていますか?私がやりたいことは可能ですか?

編集:すべてのフィールドに getter が必要で、すべてが呼び出されるGetRef()ので、ユーザーは次のように書くことができます:

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

1 に答える 1

5

テンプレートを特殊化せずに、クラス テンプレートのメンバー テンプレートを特殊化することはできません。つまり、 と がクラス テンプレートに固定されている完全な特殊化を提供してT1から、T2TX固定できるか、 を固定できないかのいずれかです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;
};
于 2012-04-21T17:08:44.830 に答える