Aquí está mi código:método de la plantilla de la especialización de clase de plantilla
template<typename T1, typename T2> class MyClass
{
public:
template<int num> static int DoSomething();
};
template<typename T1, typename T2> template<int num> int MyClass<T1, T2>::DoSomething()
{
cout << "This is the common method" << endl;
cout << "sizeof(T1) = " << sizeof(T1) << endl;
cout << "sizeof(T2) = " << sizeof(T2) << endl;
return num;
}
Funciona bien. Pero cuando trato de agregar este
template<typename T1, typename T2> template<> int MyClass<T1, T2>::DoSomething<0>()
{
cout << "This is ZERO!!!" << endl;
cout << "sizeof(T1) = " << sizeof(T1) << endl;
cout << "sizeof(T2) = " << sizeof(T2) << endl;
return num;
}
recibo errores compiller: especialización inválida explícito antes «>» símbolo plantilla-id «HacerAlgo < 0>» para «int MyClass :: HacerAlgo()» no se coincide con cualquier declaración de plantilla
Uso g ++ 4.6.1 ¿Qué debo hacer?
Pero el ejemplo no está explícitamente especializado en una plantilla de miembro de clase: está especializando una plantilla de miembro de función.Por lo tanto, la parte que ha resaltado no se aplica y el permiso otorgado en la parte anterior de la oración parece aplicarse. –
@ AlanStokes: "plantilla de miembro de clase" significa una plantilla que es miembro de una clase; podría ser una plantilla para una función o una clase anidada. La "plantilla de clase de miembro" se referiría específicamente a una plantilla de clase que es miembro (según el uso de ese término en 14.7.3/1). GCC, al menos, usa esa interpretación. –
14.5.2/1 sugiere que una plantilla que es miembro de una clase es simplemente una "plantilla de miembro". "plantilla de miembro de clase" no parece ser un término definido. Yuck. Pero parece que [DR 529] (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#529) aclarará esto para estar de acuerdo con su respuesta. –