Полная специализация шаблона метода из шаблона класса - PullRequest
2 голосов
/ 04 декабря 2010

Я знаю, что этот предмет уже давно устарел, но мне тяжело с этим конкретным случаем.

Сразу, вот что я хочу сделать:

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 ]

1 голос
/ 04 декабря 2010

Поскольку вы покидаете T, хотя специализируете только на шаблоне функций, то то, что вы пытаетесь сделать, будет называться частичной специализацией, поскольку T по-прежнему шаблонизируется, и вы можете использовать его в своей функции.Но, к сожалению, частичная шаблонная специализация функции (будь то функция-член или функция не-члена) допускается , а не .Таким образом, ваш код выдаст ошибку компиляции.

Либо вы полностью специализируетесь, специализируясь также на шаблоне класса, либо нет.

1 голос
/ 04 декабря 2010

C ++ 03 [$ 14.7.3 / 18] говорит

В явном объявлении специализации для члена шаблона класса или шаблона члена, который появляется в области пространства имен, шаблон члена и некоторые из его вмещающих шаблонов классов могут остаться не специализированными, за исключением того, что объявление не должно явно специализироваться шаблон члена класса, если его вложенные шаблоны классов также не являются явно специализированными .

Так что вам нужно специализировать и класс включения.

Нечто подобное будет работать.

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