Специализация шаблонного члена шаблона класса [дубликата]

Possible Duplicate:
Specialization of templated member function in templated class

<code>template <class T>    
class MyClass
{
   template <int N>
   void func() {printf("unspecialized\n");}
};
template<class T>
template<>
MyClass<T>::func<0>()
{
   printf("specialzied\n");
}
</code>

Это не работает. Можно ли специализировать шаблонный метод шаблонного класса?

 sth16 апр. 2012 г., 19:23
Вы должны добавить полученное сообщение об ошибке, поскольку & quot; не работает & quot; на самом деле мало что нам говорит.

Ответы на вопрос(1)

Решение Вопроса

Это не может быть сделано в соответствии с просьбой. По какой-то причине (я не уверен в обосновании)explicit (т.е.full) специализация шаблона члена допускается только в том случае, если включающий класс такжеexplicitly (т.е.fully) специализированный. Это требование четко прописано в стандарте языка (см. 14.7.3 / 18 в C ++ 98, C ++ 03 и 14.7.3 / 16 в C ++ 11).

В то же время,partial специализация членаclass разрешены шаблоны, которые во многих случаях могут быть использованы в качестве обходного пути (хотя и некрасивого). Но, очевидно, это применимо только к членуclass шаблоны. Когда дело доходит до членаfunction шаблоны, альтернативное решение должно быть использовано.

Например, возможный обходной путь - делегировать вызов статическому члену класса шаблона и вместо этого специализировать класс (что часто рекомендуется как лучшая идея, чем специализация шаблонов функций).http://www.gotw.ca/publications/mill17.htm)

template <class T>    
class MyClass
{
   template <int N, typename DUMMY = void> struct Func {
     static void func() { printf("unspecialized\n"); }
   };

   template <typename DUMMY> struct Func<0, DUMMY> {
     static void func() { printf("specialized\n"); }
   };

   template <int N> void func() { Func<N>::func(); }
};
 Alexander Vassilev16 апр. 2012 г., 19:46
Спасибо, это то, что я также узнал - я должен специализировать содержащий класс. Ваше решение с использованием класса для функции, возможно, является лучшим решением в моем случае
 17 апр. 2012 г., 04:12
@ Джерри Коффин: В C ++ 98 и C ++ 03 это было указано в 14.7.3 / 18. В C ++ 11 он был перемещен в 14.7.3.16, так какildjarn отметил.
 16 апр. 2012 г., 19:50
У вас есть ссылка на это требование? Я читал те части стандарта, которые выглядят актуальными (начиная с 14.7.3) и не смогли найти это требование.
 01 дек. 2015 г., 14:08
Теперь я убежден, что с ++ сломан без возможности восстановления ...
 16 апр. 2012 г., 20:00
@Jerry: C ++ 11 & # xA7; 14.7.3 / 16: & quot;... except that the declaration shall not explicitly specialize a class member template if its enclosing class templates are not explicitly specialized as well.& Quot;

Ваш ответ на вопрос