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 !