c++ templates specialization

c++ - plantilla miembro de la clase función solo especialización



templates specialization (2)

Estoy leyendo la Guía completa de plantillas y dice lo siguiente:

Donde está hablando sobre la especialización de plantilla de clase.

Sin embargo, si especializas una plantilla de clase, también debes especializar todas las funciones de miembros. Aunque es posible especializar una función de miembro único, una vez que lo haya hecho, ya no podrá especializar toda la clase.

De hecho, me pregunto cómo es esto cierto, porque puedes especializarte sin ninguna función miembro. ¿Está diciendo que no se puede tener una especialización con solo una función miembro y luego otra con todas las funciones miembro?

¿Alguien puede aclarar?


Creo que lo que se quiere decir es que puedes:

  • especializar toda la clase y todos los miembros (datos y funciones, estáticos o no, virtuales o no) tienen que ser declarados y definidos, incluso si son los mismos que para la versión no especializada,

  • especializa a algunos miembros de la función, pero luego no puedes especializar toda la clase (es decir, todos los miembros se declaran de la misma manera que para el caso no especializado, solo proporcionas la implementación para algunos miembros de la función).


Creo que se está refiriendo al siguiente caso:

template <typename T> struct base { void foo() { std::cout << "generic" << std::endl; } void bar() { std::cout << "bar" << std::endl; } }; template <> void base<int>::foo() // specialize only one member { std::cout << "int" << std::endl; } int main() { base<int> i; i.foo(); // int i.bar(); // bar }

Una vez hecho esto, no puedes especializar la plantilla completa para que sea cualquier otra cosa, por lo que

template <> struct base<int> {}; // error