我有一个带有模板化成员函数的模板化类
template<class T>
class A {
public:
template<class CT>
CT function();
};
现在我想以两种方式专门化模板化成员函数。首先是与班级具有相同的类型:
template<class T>
template<> // Line gcc gives an error for, see below
T A<T>::function<T>() {
return (T)0.0;
}
类型bool的第二个:
template<class T>
template<>
bool A<T>::function<bool>() {
return false;
}
以下是我试图测试的方法:
int main() {
A<double> a;
bool b = a.function<bool>();
double d = a.function<double>();
}
现在gcc给了我上面标记的行:
error: invalid explicit specialization before ‘>’ token
error: enclosing class templates are not explicitly specialize
所以gcc告诉我,如果我想专攻功能,我必须专攻A,对吗? 我不想这样做,我希望外类的类型是开放的......
最后的答案是:这是不可能的?或者有办法吗?
答案 0 :(得分:14)
是的,这就是问题所在:
error: enclosing class templates are not explicitly specialized
如果没有专门的课程,你也无法专门教授会员。
>做的是将function
中的代码放在一个单独的类中,并将其专门化,就像basic_string依赖于单独的char_traits类一样。然后,非专业的function
可以在traits类中调用帮助器。
答案 1 :(得分:5)
如果更改实施,可以使用重载。
template <typename T>
class Foo
{
public:
template <typename CT>
CT function() { return helper((CT*)0); }
private:
template <typename CT>
CT helper(CT*);
T helper(T*) { return (T)0.0; }
bool helper(bool*) { return false; }
};
简单易行:)