Question

I know this subject should be pretty much dated by now, but I'm having a tough time with this specific case.

Straight to the point, this is what I want to do:

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

Is this possible?

Was it helpful?

Solution

C++03 [$14.7.3/18] says

In an explicit specialization declaration for a member of a class template or a member template that appears in namespace scope, the member template and some of its enclosing class templates may remain unspecialized, except that the declaration shall not explicitly specialize a class member template if its enclosing class templates are not explicitly specialized as well.

So you need to specialize the enclosing class too.

Something like this would work.

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

OTHER TIPS

Since you leave T, while specializing only function template, then what you're trying to do would be called partial specialization, because T is still templated and you can use it in your function. But unfortunately, partial template specialization of function (whether be it member function or non-member function) is not allowed. So your code would give compilation error.

Either you fully specialize by specializing the class template as well, or you don't at all.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top