c++ - slideshare - ¿Por qué recibo un error al intentar llamar a una función de miembro de plantilla con un parámetro de tipo explícito?
procesos implicitos (1)
Esto se debe a una disposición realmente oscura del estándar en el que si tiene una plantilla que intenta acceder a una función de plantilla en un objeto cuyo tipo depende de un argumento de plantilla, debe usar la palabra clave de template
de una manera extraña:
this->template f<int>();
Esto es similar a la rareza con typename
que surge con los tipos dependientes, excepto cuando se aplica a las funciones. En particular, si omite la palabra clave de template
, hay una ambigüedad de análisis entre
this->f<int>()
(lo que pretendías), y
((this->f) < int) > ()
lo cual no tiene sentido (de ahí su error). El uso de la template
palabra clave aquí desambigua y obliga al compilador a reconocer que está buscando una llamada perfectamente válida para una función de miembro con plantilla en lugar de una masa de símbolos distorsionada.
¡Espero que esto ayude!
No entiendo, me parece que la llamada a f
es completamente inequívoca, pero no se puede compilar con expected primary-expression before ''int''
. Si comento la línea con la llamada a f
, compila bien.
template<typename T>
struct A {
template<typename S>
void f() { }
};
template<typename T>
struct B : A<T> {
void g() {
this->f<int>();
}
};