69 votes

Pourquoi je n'arrive pas à compiler ce désordre impie et modélisé ?

Je ne comprends pas, il me semble que l'appel à f est complètement non ambiguë, mais elle ne compile pas avec expected primary-expression before ‘int’ . Si je commente la ligne avec l'appel à f il compile bien.

template<typename T>
struct A {
    template<typename S>
    void f() { }
};

template<typename T>
struct B : A<T> {
    void g() {
        this->f<int>();
    }
};

129voto

templatetypedef Points 129554

Ceci est dû à une disposition vraiment obscure de la norme dans laquelle si vous avez un modèle qui tente d'accéder à une fonction de modèle dans un objet dont le type dépend d'un argument de modèle, vous devez utiliser la fonction template mot-clé d'une manière bizarre :

this->template f<int>();

C'est similaire à la bizarrerie avec typename qui se présente avec des types dépendants, sauf lorsqu'il s'agit de fonctions. En particulier, si vous laissez de côté le template il y a une ambiguïté d'analyse entre le mot-clé

this->f<int>()

(ce que vous vouliez), et

((this->f) < int) > ()

ce qui n'a aucun sens (d'où votre erreur). L'utilisation du mot-clé template permet de désambiguïser et de forcer le compilateur à reconnaître qu'il s'agit d'un appel parfaitement valide à une fonction membre modélisée plutôt que d'une masse confuse de symboles.

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X