c++ - tipo - función de miembro de plantilla de clase de plantilla llamada desde función de plantilla
programacion ats funciones (3)
¿Dónde se define el tipo T?
Cuando llame a la función g () en ese momento debe conocerse el tipo T, de lo contrario, prepárese para el error del compilador que indique que T no está definido.
Esto no compila:
template<class X> struct A {
template<int I> void f() {}
};
template<class T> void g()
{
A<T> a;
a.f<3>(); // Compilation fails here (Line 18)
}
int main(int argc, char *argv[])
{
g<int>(); // Line 23
}
El compilador (gcc) dice:
hhh.cpp: En la función ''void g ()'':
hhh.cpp: 18: error: expresión primaria esperada antes del token '')''
hhh.cpp: En la función ''void g () [con T = int]'':
hhh.cpp: 23: instanciado desde aquí
hhh.cpp: 18: error: uso no válido del miembro (¿se olvidó de ''&''?)
¿Alguien puede explicar por qué es esto? ¿Hay alguna manera de hacer que funcione?
¿Podrías especificar qué compilador estás usando? El código en la pregunta, con
int main() {
g<int>();
}
se compiló sin problemas utilizando cl.exe de Microsoft Visual Studio 9;
Falló en varias versiones de G ++ que probé, y el compilador en línea Comeau también.
Pruebe el siguiente código:
template<class T> void g()
{
A<T> a;
a.template f<3>(); // add `template` keyword here
}
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 postfix , o después de especificador de nombre anidado en un id-calificado , y la expresión de postfix 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 futuro estándar de C ++ parece requerir esta palabra clave de acuerdo con el borrador n2857 14.3 / 4. Algunos compiladores tienen un modo especial que permite compilar el código original sin errores (Comeau lo compila en el denominado modo relajado ).