¿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>();
    }
};
Author: templatetypedef, 2011-02-09

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!

 129
Author: templatetypedef,
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