Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

templates et typenames

5 réponses
Avatar
meow
Bonjour,

Juste une petite question pour me remettre dans le bain apr=E8s une
longue abstinanC++e

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

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

--Ben

5 réponses

Avatar
Jean-Marc Bourguet
meow writes:

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

Avatar
meow
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...

Avatar
meow
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...

Avatar
Jean-Marc Bourguet
meow writes:

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

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


Limpide, je vais pouvir dormir tranquille.

Merci