如何根据类的模板参数来专门化模板成员函数?

Gab*_*iel 4 c++ templates template-specialization

我想写这个:

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; }
Run Code Online (Sandbox Code Playgroud)

哪个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; }
Run Code Online (Sandbox Code Playgroud)

我错过了什么?我甚至想做什么?

编辑:我想要所有字段的getter,所有调用GetRef(),所以用户可以编写如下内容:

OK<float,double> ok;
float a = ok.GetRef<float>();
double b = ok.GetRef<double>();
Run Code Online (Sandbox Code Playgroud)

Dav*_*eas 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;
};
Run Code Online (Sandbox Code Playgroud)

  • @Gabriel:没有......我想我真的不明白你要做的是什么,但你为什么不提供两个不同的功能来回报每个成员呢?如果你想要的是一个`GetRef`,它将返回基于类型的任一选项,那么你可以添加一个额外的间接级别来解决它:`template <typename T> T const&get()const {return get((T*)0); }; T1 const&get(T1*){return t1; } T2 const&get(T2*){return t2; }`两个非模板`get`将是私有的. (2认同)