Estoy leyendo Vandevoorde y Josuttis "C++ Templates The Complete Guide" (que parece bastante bueno, por cierto). Este reclamo (sección 3.3) parece estar equivocado and is not in the published errata:¿Este libro de texto está equivocado? Especializando algunas funciones miembro pero no otras
Si especializa una plantilla de clase, también debe 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.
Sin embargo, las siguientes compilaciones de gcc plantilla
<typename T>
struct C {
T foo();
T bar();
};
template <>
struct C<int> {
int foo();
int bar() {return 4;}
};
template <typename T>
T C<T> :: foo() {return 0;}
template <typename T>
T C<T> :: bar() {return 1;}
int C<int> :: foo() {return 2;}
template <>
float C<float> :: bar() {return 3;}
#include <cassert>
int main() {
C<int> i;
C<float> f;
assert (2 == i .foo());
assert (0 == f .foo());
assert (4 == i .bar());
assert (3 == f .bar());
}
que se han especializado C<int>::foo
y C<float>::bar
también lo es el libro de texto mal, es gcc ir más allá de la norma, o estoy malentendido toda la situación?
Gracias.
Usted malinterpretado la regla. Una vez que haya especializado una función miembro, no podrá especializar una clase en el mismo tipo, no en todos los demás tipos. –