c++ - plantillas - programacion ats funciones
¿Cómo llamar a una función de miembro de plantilla? (2)
Posible duplicado:
Función miembro de la plantilla C ++ de la clase de plantilla llamada desde la función de plantilla
template<class T1>
class A
{
public:
template<class T0>
void foo() const {}
};
template<class T0,class T1>
void bar( const A<T1>& b )
{
b.foo<T0>(); // This throws " expected primary-expression before ‘>’ token"
}
Puedo cambiarlo a
b->A<T1>::template foo<T0>();
que compila bien. Sin embargo, también puedo cambiarlo a
b.A<T1>::template foo<T0>();
que compila bien también. ¿eh?
¿Cómo se puede llamar correctamente la función miembro de la plantilla en el sentido del código original?
Acabo de encontrarlo:
De acuerdo con C ++ ''03 Standard 14.2 / 4:
Cuando aparece el nombre de una especialización de plantilla de miembro después
.
o->
en una expresión de postfijo, o después de especificador de nombre anidado en un id-calificado, y la expresión de postfijo o id-calificado depende explícitamente de un parámetro de plantilla (14.6.2), el nombre de la plantilla de miembro debe ser prefijado por latemplate
la palabra clave. De lo contrario, se asume que el nombre no es una plantilla.
El código correcto es:
b.template foo<T0>();
puede llamar a la función de esta manera:
b.template foo<T0>();