OVH Cloud OVH Cloud

iterateur dans un template

6 réponses
Avatar
Alain Cabiran
bonjour,

ce code ne compile pas et je ne comprend pas pourquoi

#include <list>

template <class T> class A {
public:
typedef std::list<T> itlist;
int i;
itlist l;
itlist::iterator it;
};

int main(void)
{
A<int> inta;
}

j'ai essayé avec std::list<T> à la place de itlist mais
bien évidement celà n'y change rien : l'itérateur coince,

merci d'avance pour toute idée, piste, explication pourquoi
"marchera pas" ...

Alain Cabiran

6 réponses

Avatar
Jean-Marc Bourguet
Alain Cabiran writes:

bonjour,

ce code ne compile pas et je ne comprend pas pourquoi

#include <list>

template <class T> class A {
public:
typedef std::list<T> itlist;
int i;
itlist l;
itlist::iterator it;
typename itlist::iterator it;

};

int main(void)
{
A<int> inta;
}

j'ai essayé avec std::list<T> à la place de itlist mais
bien évidement celà n'y change rien : l'itérateur coince,

merci d'avance pour toute idée, piste, explication pourquoi
"marchera pas" ...


itlist::iterator est un nom dépendant et il faut indiquer
que c'est un nom de type. (De même que si c'était un
template il faudrait l'indiquer avec template).

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
Fabien LE LEZ
On Tue, 26 Oct 2004 20:09:26 +0200, Alain Cabiran :

ce code ne compile pas et je ne comprend pas pourquoi


J'avoue que moi non plus, d'autant que Borland C++ 5.02, pourtant
assez mauvais d'habitude avec les templates (car très vieux),
l'accepte sans broncher. Indique le message d'erreur (y compris un
repère sur la ligne concernée par le message), ainsi que le
compilateur.

J'ai toutefois remarqué deux trucs passablement douteux dans ton
code :

typedef std::list<T> itlist;


"itlist" pour un type "liste" ? Un tel nom ne correspondrait-il pas
plutôt à un itérateur ?

D'autre part, je te conseille d'utiliser des conventions pour
distinguer les noms de types des noms de variables. Perso, je mets des
majuscules aux noms de types et des underscores aux noms de
variables :

typedef std::list<T> ListeDeT;
ListeDeT une_liste;

int i;
itlist l;
itlist::iterator it;


Ces trois membres ne devraient-ils pas être privés ?


--
;-)

Avatar
Alain Cabiran
On Tue, 26 Oct 2004 20:09:26 +0200, Alain Cabiran :


ce code ne compile pas et je ne comprend pas pourquoi



J'avoue que moi non plus, d'autant que Borland C++ 5.02, pourtant


jean marc avait raison, c'est typename qui manque, je l'ai pas encore
bien assimilé celui là.

assez mauvais d'habitude avec les templates (car très vieux),


depuis que je suis passé (en force :-)) à gcc 3.0 j'ai plein d'erreurs
de compil que j'avais pas avec gcc 2.95 mais bon c'est largement
compensé par les amélioration de la conformit à la stl et au C++
standard.

l'accepte sans broncher. Indique le message d'erreur (y compris un
repère sur la ligne concernée par le message), ainsi que le
compilateur.


syntax error, effectivement sans typename, iterator est indéfini...

J'ai toutefois remarqué deux trucs passablement douteux dans ton
code :
snip
...


douteux est un euphémisme, c'est du code de porc (braisée, hhmf désolé,
j'ai pas pu résister :-) ).

je crée des morceaux les plus petits possibles, sans contrôles
particulier pour trouver ce qui ne va pas et ensuite je l'inclue
dans la classe que je tente de créer (SortedList). Je suis obligé de
passer par un aggrégat. std::list<mere> ne gère pas le polymorphisme
seul std::list<Mere *> le gère et ça ne me convient pas du tout.

ouala

merci à vous, ça marche maintenant.

Alain


Avatar
Fabien LE LEZ
On Tue, 26 Oct 2004 21:58:18 +0200, Alain Cabiran :

jean marc avait raison, c'est typename qui manque, je l'ai pas encore
bien assimilé celui là.


J'avoue que moi non plus ~_~
Mais bon, j'ai une excuse : n'ayant réellement commencé à étudier le
C++ qu'il y a quatre ans environ, je suis encore un débutant...


--
;-)

Avatar
kanze
Fabien LE LEZ wrote in message
news:...
On Tue, 26 Oct 2004 21:58:18 +0200, Alain Cabiran :

jean marc avait raison, c'est typename qui manque, je l'ai pas encore
bien assimilé celui là.


J'avoue que moi non plus ~_~

Mais bon, j'ai une excuse : n'ayant réellement commencé à étudier le
C++ qu'il y a quatre ans environ, je suis encore un débutant...


Je dirais que c'est plutôt toi qui a l'avantage. Moi, je me sers d'un
langage qui s'appelle C++ depuis quinze ans. Ce qui fait que j'ai
énormement à désapprendre -- le C++ d'aujourd'hui n'est qu'un parent
lointain au C++ que j'ai appris. (Je dirais qu'il y a plus de
différences entre le C++ d'aujourd'hui et celui j'ai appris -- grosso
modo celui de CFront 2.1, qu'il n'y en a entre le C++ que j'ai appris et
le C.)

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Fabien LE LEZ
On 27 Oct 2004 00:43:29 -0700, :

Je dirais que c'est plutôt toi qui a l'avantage.


Pas forcément : ayant fait du C avant (pas pendant 15 ans, toutefois,
vu que j'ai commencé avec Basic sur TO7 ;) ), mon cas n'est pas si
différent du tien.


--
;-)