从类模板完全专业化方法模板

时间:2010-12-04 09:36:33

标签: c++ templates gcc template-specialization

我知道这个问题现在应该已经过时了,但我对这个具体案例感到很难过。

直截了当,这就是我想要做的事情:

enum MyEnum
{
    E_1,
    E_2
};

template <MyEnum T>
class MyClass
{
    // method to be fully specialized
    template <typename U>
    void myMethod(U value);
};

// full specialization of method template from class template
// (or is this in fact partial, since I'm leaving T alone?)
template <MyEnum T>
template <>
void MyClass<T>::myMethod<int>(int value)
{
    std::cout << value << '\n';
}

这可能吗?

2 个答案:

答案 0 :(得分:1)

C ++ 03 [$ 14.7.3 / 18]说

  

在类模板成员或出现在命名空间作用域中的成员模板的显式特化声明中,成员模板及其某些封闭类模板可能仍然是非专业的,除了声明不应明确专门化一个类成员模板,如果它的封闭类模板也没有明确专门化

所以你也需要专门化封闭类。

这样的事情会起作用。

template <>
template <>
void MyClass<E_1>::myMethod<int>(int value)
{
    std::cout << value << '\n';
}

答案 1 :(得分:1)

由于你离开T,虽然只专注于函数模板,但你想要做的事情将被称为部分特化,因为T仍然是模板化的,你可以在你的函数中使用它。但不幸的是,函数的部分模板特化(无论是成员函数还是非成员函数)是允许的。所以你的代码会给出编译错误。

你可以通过专门化课程模板来完全专攻,或者你根本不专注。