Écrire une fonction modélisée, j'ai déclaré: compilation avec g ++ 4.0.1 J'ai eu l'erreur: p> error: 'T::size_type' is not a type
4 Réponses :
Vous devez ajouter de la typename.
I.e. p> sans avoir d'informations sur votre type T, le compilateur doit savoir que T :: Taille_type désigne un type. P> de la section standard, section 14.6.2: P> 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>. p>
blockQuote> p>
Il s'est avéré que je devais préciser que T :: Taille_type était un nom de typage. Pourquoi est-ce?
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)
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; -) P>
Edit: Si vous le compilez avec -fpermissive, le compilateur mâche probablement votre code, mais il donnera un avertissement. P>
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?
Comme vous l'avez trouvé T :: Taille_Type doit être préfixé avec typename. Pourquoi? P>
de "C ++ modèles: le guide complet" p>
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 em> désigne un type à moins que ce nom soit préfixé avec le mot-clé Typename. P>
... Le préfixe de typename à un nom est requis em> quand le nom p>
- apparaît dans un modèle li>
- est qualifié li>
- 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 li>
- dépend d'un paramètre de modèle LI> ol>
En outre, le préfixe de typename est pas autorisé em> sauf au moins les trois premières conditions précédentes. P> blockQuote>
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.