我想写这个:
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>();
答案 0 :(得分: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;
};