No se puede hacer según lo solicitado. Por alguna razón (no estoy seguro de la razón) explícita (es decir completa) especialización de un miembro de la plantilla sólo se permite cuando la clase envolvente es también explícitamente (es decir, totalmente ) especializado. Este requisito se explica explícitamente en el estándar de lenguaje (véanse 14.7.3/18 en C++ 98, C++ 03 y 14.7.3/16 en C++ 11).
Al mismo tiempo, parciales especializaciones de clase de miembro se permite plantillas, que en muchos casos se puede utilizar como una solución (aunque una fea). Pero, obviamente, solo se aplica a las plantillas de la clase. Cuando se trata de plantillas de función, se debe usar una solución alternativa.
Por ejemplo, una posible solución consiste en delegar la llamada a un miembro estático de una clase de plantilla y especializar la clase en lugar (lo que se recomienda a menudo como una idea mejor que la especialización de las plantillas de función 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(); }
};
Debe agregar el mensaje de error que recibe, ya que "no funciona" realmente no nos dice mucho. – sth