ventajas tipo slideshare relación procesos memoria implícito implicitos implicito explícito ejemplo desventaja conocimiento concepto con características aprendizaje c++ templates metaprogramming

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>(); } };