模板化类中模板化成员函数的特化

时间:2011-07-21 08:35:43

标签: c++ template-specialization

我有一个带有模板化成员函数的模板化类

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,对吗? 我不想这样做,我希望外类的类型是开放的......

最后的答案是:这是不可能的?或者有办法吗?

2 个答案:

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

简单易行:)