Maison >développement back-end >C++ >Pourquoi le compilateur ne parvient-il pas à compiler lors de l'appel d'une fonction membre de modèle dans une fonction de modèle ?
Invocation de fonction membre de modèle dans les fonctions de modèle
L'extrait de code fourni illustre une erreur rencontrée lors de l'appel d'une fonction membre de modèle à partir d'une fonction de modèle :
<code class="cpp">template<class X> struct A { template<int I> void f() {} }; template<class T> void g() { A<T> a; a.f<3>(); // Compilation fails here }</code>
Le compilateur ne parvient pas à compiler ce code, signalant une erreur liée à une utilisation non valide du membre et suggérant que '&' a peut-être été oublié.
Explication
L'erreur se produit car le code tente d'invoquer un modèle de membre sans spécifier explicitement le mot-clé 'template' avant celui-ci. Selon la norme C (14.2/4), lorsque le nom d'une spécialisation de modèle de membre est utilisé après un point ou une flèche dans une expression suffixe, ou après un spécificateur de nom imbriqué dans un identifiant qualifié, et l'expression postfixée ou l'identifiant qualifié dépend explicitement d'un paramètre de modèle, le nom du modèle membre doit être préfixé par le mot clé « modèle ». Sinon, le nom sera supposé faire référence à un non-modèle.
Solution
Pour résoudre ce problème, le code doit être modifié pour spécifier explicitement le 'modèle ' avant le nom du modèle de membre :
<code class="cpp">template<class T> void g() { A<T> a; a.template f<3>(); // add 'template' keyword here }</code>
Avec cette modification, le compilateur pourra identifier et appeler correctement la fonction du modèle de membre, et le code sera compilé avec succès.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!