2012-10-01 16 views
23

Duplicar posible:
C++ template member function of template class called from template function¿Cómo llamar a una función de miembro 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 a la función de miembro de la plantilla en el sentido del código original?

+0

¿Sabemos lo que las dos declaraciones que en realidad significan de compilación? En este ejemplo "cocido" compilan, pero en mi programa real esto no compila. – ritter

Respuesta

37

acaba de encontrar:

Según C++ 03 estándar 14.2/4:

Cuando el nombre de una especialización de plantilla miembro aparece después de . o -> en un sufijo-expresión, o después de identificador 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 ir precedido de la palabra clave template. De lo contrario, se asume que el nombre no es una plantilla.

código correcto es:

b.template foo<T0>(); 
+1

Y esto se hace por la misma razón y en condiciones similares a cuando 'typename' es necesario. – bames53

10

puede llamar a la función de esta manera:

b.template foo<T0>(); 
Cuestiones relacionadas