8
votes

g ++ "n'est pas une erreur" erreur "

Écrire une fonction modélisée, j'ai déclaré: xxx pré>

compilation avec g ++ 4.0.1 J'ai eu l'erreur: p>

error: 'T::size_type' is not a type


0 commentaires

4 Réponses :


30
votes

Vous devez ajouter de la typename.

I.e. xxx

sans avoir d'informations sur votre type T, le compilateur doit savoir que T :: Taille_type désigne un type.

de la section standard, section 14.6.2:

Nom utilisé dans une déclaration ou une définition de modèle et qui dépend d'un paramètre de modèle est supposé ne pas nommer un type à moins que la recherche de nom applicable ne trouve qu'un nom de type ou le nom est qualifié par le mot-clé typename < / code>.


0 commentaires

0
votes

Il s'est avéré que je devais préciser que T :: Taille_type était un nom de typage. Pourquoi est-ce? XXX


2 commentaires

Pour désambiguez entre un nom d'instance possible et un nom de type possible. Pour plus d'informations, lisez les modèles de livre C ++; The Termin Guide - info de Josuttis.com/tmplbook/tmplbook.html


cela devrait être une question distincte. (Bien que cela ait été posé auparavant. Cherchez un peu)



3
votes

Parce que lors de l'analyse de la déclaration de modèle, T n'est pas connu. Donc, le compilateur ne sait pas si ::ze_type existe du tout. Il peut se référer à une variable statique, par exemple. Lorsque vous utilisez ultérieurement le modèle, T est bien sûr connu, mais l'erreur se produit plus tôt. Et s'il vous plaît utiliser quelque chose de moins ancien que GCC 4.0.1; -)

Edit: Si vous le compilez avec -fpermissive, le compilateur mâche probablement votre code, mais il donnera un avertissement.


3 commentaires

GCC 4.0.1 est le plus courant - sur le Mac :)


Si vrai, une autre raison de ne pas utiliser de Mac. La dernière qualité de production G ++ est 4.4.0


Je ne suppose pas que vous soyez applaudi pour apprendre que la version de septembre de Mac 10.6 utilisera GCC 4.2.1 comme défaut?



7
votes

Comme vous l'avez trouvé T :: Taille_Type doit être préfixé avec typename. Pourquoi?

de "C ++ modèles: le guide complet"

La définition de la langue résout ce problème en précisant que, en général, un nom qualifié dépendant pas désigne un type à moins que ce nom soit préfixé avec le mot-clé Typename.

... Le préfixe de typename à un nom est requis quand le nom

  1. apparaît dans un modèle
  2. est qualifié
  3. n'est pas utilisé comme liste des spécifications de la classe de base ou dans une liste des initialisations des membres introduisant une définition de constructeur
  4. dépend d'un paramètre de modèle

    En outre, le préfixe de typename est pas autorisé sauf au moins les trois premières conditions précédentes.


2 commentaires

J'ai maintenant lu ce passage, merci (ces lire à la maison peuvent voir l'explication détaillée à la page 130). Je ne vois toujours pas pourquoi "typename" est requis dans une déclaration d'argumentation, comme cela doit être un type, mais peut-être que c'est juste pour la cohérence avec les déclarations en général.


@wnissen: Il existe généralement de telles exigences pour empêcher les constructeurs d'analyseurs heureux. Une partie du problème est que vous savez déjà que c'est une déclaration d'argumentation. En raison du problème du "paquet le plus vexant", l'analyseur doit généralement en déduire que des jetons entre (). Maintenant, si vous dites que l'interprétation des jetons entre () devrait dépendre de savoir que c'est une déclaration d'argumentation, vous avez introduit un problème d'analyse cyclique.