2012-04-16 17 views
6

Duplicar posibles:
Specialization of templated member function in templated classEspecializada un miembro de plantilla de una clase de plantilla

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

Esto no funciona. ¿Es posible especializar un método de plantilla de una clase de plantilla?

+1

Debe agregar el mensaje de error que recibe, ya que "no funciona" realmente no nos dice mucho. – sth

Respuesta

13

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(); } 
}; 
+0

Gracias, eso es lo que descubrí también - Tengo que especializar la clase contenedora. Su solución con el uso de una clase para la función es quizás la mejor solución en mi caso –

+0

¿Tiene una referencia para este requisito? He estado leyendo la (s) parte (s) de la norma que parecen relevantes (comenzando por §14.7.3) y no he podido encontrar este requisito. –

+2

@Jerry: C++ 11 §14.7.3/16: "* ... excepto que la declaración no debe especializar explícitamente una plantilla de miembro de la clase si las plantillas de clases que la rodean tampoco están explícitamente especializadas. *" – ildjarn

Cuestiones relacionadas