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 ?

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 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-02 16:08:29768parcourir

Why does the compiler fail to compile when invoking a template member function within a template function?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn