templates et typenames

Le
meow
Bonjour,

Juste une petite question pour me remettre dans le bain après une
longue abstinanC++e

typedef typename AS::Cell_handle Cell_handle;
for (typename std::list<Cell_handle>::iterator i= blahblah blah )

je ne comprend pas pourquoi le typename est necessaire dans le
"for"

--Ben
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Marc Bourguet
Le #308486
meow
Bonjour,

Juste une petite question pour me remettre dans le bain après une
longue abstinanC++e

typedef typename AS::Cell_handle Cell_handle;
for (typename std::list<Cell_handle>::iterator i= blahblah blah ...)

je ne comprend pas pourquoi le typename est necessaire dans le
"for"...


Pour la raison habituelle: iterator depend d'un parametre template (AS) et
les identifieurs dependants d'un parametre template et designant des types
doivent etre precede de typename.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

meow
Le #308462
Merci pour la réponse, mais ça n'est pas encore très clair pour moi.

Pour la raison habituelle: iterator depend d'un parametre template (AS) et
les identifieurs dependants d'un parametre template et designant des types
doivent etre precede de typename.


iterator dépend d'un paramètre template, mais en l'occurrence j'e l'ai
instancié avec AS dont j'ai précisé juste au dessus que c'était bien
un nom de type... Bref, je ne vois pas la différence entre
list<AS>::iterator
et
list<int>::iterator,
qui lui ne necessite pas d'etre précédé de typename...

meow
Le #308461
Petite typo : j'ai écrit
list<AS>::iterator


où je pensais à
list<typename AS::Cell_handle>::iterator

Je reprécise donc le contexte :

template <class AS>
bool foo() {
typedef typename AS::Cell_handle Cell_handle;
typename list<Cell_handle>::iterator i;
list<int>::iterator j;
...
}

un iterator demande un typename, l'autre pas...

Jean-Marc Bourguet
Le #308460
meow
Je reprécise donc le contexte :

template <class AS>
bool foo() {
typedef typename AS::Cell_handle Cell_handle;
typename list<Cell_handle>::iterator i;
list<int>::iterator j;
...
}

un iterator demande un typename, l'autre pas...


L'un depend du parametre template, l'autre pas.

Rien ne permet au compilateur de savoir que list<Cell_handle>::iterator est
un type (parce qu'il pourait y avoir une specialisation pour laquelle ce
n'est pas le cas).

A+


--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

meow
Le #308459
parce qu'il pourait y avoir une specialisation pour laquelle ce n'est pas le cas


Limpide, je vais pouvir dormir tranquille.

Merci

Publicité
Poster une réponse
Anonyme