45 votes

fonction membre de la classe modèle appelée depuis la fonction modèle

Ça ne se compile pas :

template<class X> struct A {
   template<int I> void f() {}
};

template<class T> void g()
{
   A<T> a;
   a.f<3>();  // Compilation fails here (Line 18)
}

int main(int argc, char *argv[])
{
   g<int>();  // Line 23
}

Le compilateur (gcc) dit :

hhh.cpp : Dans la fonction 'void g()' :

hhh.cpp:18 : erreur : expression primaire attendue avant le jeton ')

hhh.cpp : Dans la fonction 'void g() [avec T = int]' :

hhh.cpp:23 : instancié à partir d'ici

hhh.cpp:18 : error : invalid use of member (avez-vous oublié le '&' ?)

Quelqu'un peut-il expliquer pourquoi ? Existe-t-il un moyen de le faire fonctionner ?

78voto

Kirill V. Lyadvinsky Points 47627

Essayez le code suivant :

template<class T> void g()
{
   A<T> a;
   a.template f<3>();  // add `template` keyword here
}

Selon la norme C++'03 14.2/4 :

Lorsque le nom d'une spécialisation de modèle de membre apparaît après . o -> dans un postfix -ou après l'expression spécification de nom imbriqué dans un qualified-id et que l'expression postfixe ou l'identifiant qualifié dépend explicitement d'un paramètre de modèle (14.6.2), le nom du modèle membre doit être préfixé par le mot-clé template . Sinon, le nom est supposé être un nom de non-modèle.

Le futur standard C++ semble toujours exiger ce mot clé selon le projet n2857 14.3/4. Certains compilateurs disposent d'un mode spécial qui permet de compiler le code original sans erreurs (Comeau le compile dans un mode appelé "mode d'erreur"). mode décontracté ).

0voto

Ashish Points 2401

Où est défini le type T ?

Lorsque vous appelez la fonction g() à ce moment-là, le type T doit être connu, sinon préparez-vous à une erreur du compilateur disant que T est indéfini.

0voto

grrussel Points 3315

Pourriez-vous préciser quel compilateur vous utilisez ? Le code dans la question, avec

int main() {
   g<int>();
}

ajouté compilé sans problème en utilisant cl.exe à partir de Microsoft Visual Studio 9 ;

Il n'a pas fonctionné sur les différentes versions de G++ que j'ai essayées, et le fichier Comeau compilateur en ligne également.

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