¿Por qué recibo un error al intentar llamar a una función miembro de plantilla con un parámetro de tipo explícito?
No lo entiendo, me parece que la llamada a f
es completamente inequívoca, pero no se compila con expected primary-expression before ‘int’
. Si comento la línea con la llamada a f
, se compila bien.
template<typename T>
struct A {
template<typename S>
void f() { }
};
template<typename T>
struct B : A<T> {
void g() {
this->f<int>();
}
};
1 answers
Esto se debe a una disposición realmente oscura del estándar en la 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 template
de una manera extraña:
this->template f<int>();
Esto es similar a la rareza con typename
que aparece con tipos dependientes, excepto cuando se aplica a las funciones. En particular, si omites la palabra clave template
, hay una ambigüedad de análisis entre
this->f<int>()
(lo que previsto), y
((this->f) < int) > ()
Que no tiene sentido (de ahí tu error). El uso de la palabra clave template
aquí desambiga y obliga al compilador a reconocer que está buscando una llamada perfectamente válida a una función miembro templada en lugar de una masa confusa de símbolos.
Espero que esto ayude!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-06 19:56:13