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然后T2将其固定在类模板上,然后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;
};
于 2012-04-21T17:08:44.830 回答