2

我知道这个主题现在应该已经过时了,但我在这个具体案例上遇到了困难。

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

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';
}

这可能吗?

4

2 回答 2

1

C++03 [$14.7.3/18] 说

在类模板的成员或出现在命名空间范围内的成员模板的显式特化声明中,成员模板和它的一些封闭类模板可能保持未特化,除非声明不应显式特化类成员模板,如果它封闭类模板也没有明确专门化

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

像这样的东西会起作用。

template <>
template <>
void MyClass<E_1>::myMethod<int>(int value)
{
    std::cout << value << '\n';
}
于 2010-12-04T09:49:43.330 回答
1

既然你离开了 T,而只特化了函数模板,那么你试图做的将被称为部分特化,因为 T 仍然是模板化的,你可以在你的函数中使用它。但不幸的是,函数的部分模板特化(无论是成员函数还是非成员函数)是不允许的。所以你的代码会给出编译错误。

要么通过专门化类模板来完全专精,要么根本不专精。

于 2010-12-04T10:03:01.363 回答