C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

probléme avec des classes templates pour liste chainées
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
farid b
Guest





PostPosted: Thu Feb 26, 2004 10:07 pm    Post subject: probléme avec des classes templates pour liste chainées Reply with quote



bonjour,

dans le but de me faire des classes génériques pour gérer des listes
chainées,j'ai adapté du code d'un bouquin
cependant ça plante à la compile avec pas mal d'erreur dont les plus
graves à mon sens sont le refus du compilateur de reconnaitre 2 classes
templates. les messages sont assez clair:

Quote:
liste.hpp:5: déclaration de «class T»
liste.hpp:1: fait ombrage au paramètre du patron «class T»
liste.hpp:5: « debut » n'est pas un patron
liste.hpp:5: ISO C++ interdit la déclaration de « type name » sans type
liste.hpp:6: déclaration de «class T»
liste.hpp:1: fait ombrage au paramètre du patron «class T»
liste.hpp:6: « iterator » n'est pas un patron
liste.hpp:6: ISO C++ interdit la déclaration de « type name » sans type
liste.hpp:15: déclaration de «class T»
liste.hpp:12: fait ombrage au paramètre du patron «class T»
liste.hpp:15: « iterator » n'est pas un patron
liste.hpp:15: ISO C++ interdit la déclaration de « type name » sans type

je vous joint le listing complet (c'est pas trés long)
merci de votre aide...

template <class T>
class list {
private:
list <T> *suivant;
template <class T> friend class debut <T>;
template <class T> friend class iterator <T>;
public:

T data;
};

template <class T>
class debut {
list<T> * start;
template <class T> friend class iterator<T>;
public:
debut(void) {start=0;}
~debut(void);
void add(T t);
int ismember(T t);
};

template <class T>
void debut<T>::add(T t)
{list<T> *p=start, *q=start, *r;
while (!p=0) {q=p; p = p->suivant;}
r = new list<T>;
r->data = t;
r->suivant=0;
if(start) q->suivant = r;
else start = r;
}

template <class T>
int debut<T>::ismember(T t)
{list<T> *p = start , *q = start;
while (p!=0)
{ q = p;
p = p->suivant;
if(q->data==t) return 1;
}
return 0;
}

template <class T>
debut<T>::~debut(void)
{list<T> *p = start, *q;
while (p!=0)
{q = p;
p = p->suivant;
delete q;
}
start=0;
}

template <class T>
class iterator {
debut<T> *l;
list<T> *courant ;
public: void reset(void) {courant = l->start;}
iterator (debut<T> *li) { l=li; reset();}
list<T> *suivant(void);
};

template <class T>
list<T> * iterator<T>::suivant(void)
{
list<T> *p = courant ;
if ( courant ) courant = courant->suivant;
return p;
}

typedef debut<char *> list_string;
typedef debut<double> list_double;
typedef debut<int> list_int;
typedef debut<char> list_char;
typedef list<char *> * list_string_ptr;
typedef list<double> * list_double_ptr;
typedef list<int> * list_int_ptr;
typedef list<char> * list_char_ptr;
typedef iterator<char *> list_string_iterator;
typedef iterator<double> list_double_iterator;
typedef iterator<int> list_int_iterator;
typedef iterator<char> list_char_iterator;


Back to top
Régis Troadec
Guest





PostPosted: Fri Feb 27, 2004 12:10 am    Post subject: Re: probléme avec des classes templates pour liste chainées Reply with quote



Salut,

"farid b" <fbouzema-nospam (AT) free (DOT) fr> a écrit dans le message de news:
403e6ccb$0$28636$626a14ce (AT) news (DOT) free.fr...
Quote:
bonjour,

dans le but de me faire des classes génériques pour gérer des listes
chainées,j'ai adapté du code d'un bouquin
cependant ça plante à la compile avec pas mal d'erreur dont les plus
graves à mon sens sont le refus du compilateur de reconnaitre 2 classes
templates. les messages sont assez clair:

liste.hpp:5: déclaration de «class T»
liste.hpp:1: fait ombrage au paramètre du patron «class T»
liste.hpp:5: « debut » n'est pas un patron
liste.hpp:5: ISO C++ interdit la déclaration de « type name » sans type
liste.hpp:6: déclaration de «class T»
liste.hpp:1: fait ombrage au paramètre du patron «class T»
liste.hpp:6: « iterator » n'est pas un patron
liste.hpp:6: ISO C++ interdit la déclaration de « type name » sans type
liste.hpp:15: déclaration de «class T»
liste.hpp:12: fait ombrage au paramètre du patron «class T»
liste.hpp:15: « iterator » n'est pas un patron
liste.hpp:15: ISO C++ interdit la déclaration de « type name » sans type

je vous joint le listing complet (c'est pas trés long)
merci de votre aide...

J'ai déjà eu ce genre d'ennui, c'est avec quel compilo ?

Généralement, le compilo en question n'admet pas que T soit un type avec le
mot-clé class dans ton argument de modèle .

Il faut généralement expliciter le fait que T soit un type en utilisant le
mot-clé typename.

exple :
template <typename T> class list {
....
};

et pareil pour les autres ...

a+ Regis


Quote:
template <class T
class list {
private:
list template <class T> friend class debut <T>;
template <class T> friend class iterator <T>;
public:

T data;
};

template <class T
class debut {
list template <class T> friend class iterator<T>;
public:
debut(void) {start=0;}
~debut(void);
void add(T t);
int ismember(T t);
};

template <class T
void debut {list<T> *p=start, *q=start, *r;
while (!p=0) {q=p; p = p->suivant;}
r = new list<T>;
r->data = t;
r->suivant=0;
if(start) q->suivant = r;
else start = r;
}

template <class T
int debut {list<T> *p = start , *q = start;
while (p!=0)
{ q = p;
p = p->suivant;
if(q->data==t) return 1;
}
return 0;
}

template <class T
debut {list<T> *p = start, *q;
while (p!=0)
{q = p;
p = p->suivant;
delete q;
}
start=0;
}

template <class T
class iterator {
debut list<T> *courant ;
public: void reset(void) {courant = l->start;}
iterator (debut<T> *li) { l=li; reset();}
list<T> *suivant(void);
};

template <class T
list {
list<T> *p = courant ;
if ( courant ) courant = courant->suivant;
return p;
}

typedef debut<char *> list_string;
typedef debut<double> list_double;
typedef debut<int> list_int;
typedef debut<char> list_char;
typedef list<char *> * list_string_ptr;
typedef list<double> * list_double_ptr;
typedef list<int> * list_int_ptr;
typedef list<char> * list_char_ptr;
typedef iterator<char *> list_string_iterator;
typedef iterator<double> list_double_iterator;
typedef iterator<int> list_int_iterator;
typedef iterator<char> list_char_iterator;




Back to top
Fabien LE LEZ
Guest





PostPosted: Fri Feb 27, 2004 7:42 am    Post subject: Re: probléme avec des classes templates pour liste chainées Reply with quote



On Fri, 27 Feb 2004 01:10:47 +0100, "Régis Troadec" <regt (AT) wanadoo (DOT) fr>
wrote:

Quote:
Généralement, le compilo en question n'admet pas que T soit un type avec le
mot-clé class dans ton argument de modèle .

Il faut généralement expliciter le fait que T soit un type en utilisant le
mot-clé typename.

Un compilo à éviter absolument donc...

--
;-)

Back to top
Franck Branjonneau
Guest





PostPosted: Fri Feb 27, 2004 10:23 am    Post subject: Re: probléme avec des classes templates pour liste chainées Reply with quote

farid b <fbouzema-nospam (AT) free (DOT) fr> écrivait:

Quote:
bonjour,

dans le but de me faire des classes génériques pour gérer des listes
chainées,j'ai adapté du code d'un bouquin
cependant ça plante à la compile avec pas mal d'erreur dont les plus
graves à mon sens sont le refus du compilateur de reconnaitre 2
classes templates.

je vous joint le listing complet (c'est pas trés long)
merci de votre aide...

template <class T> class debut;
template <class T> class iterator;

Quote:
template <class T
class list {
private:
list template <class T> friend class debut <T>;
template <class T1> friend class debut;
template <class T> friend class iterator <T>;
template <class T1> friend class iterator;
public:

T data;
};

Idem pour la suite.
--
Franck Branjonneau <fasbjx (AT) free (DOT) fr>

Back to top
farid b
Guest





PostPosted: Fri Feb 27, 2004 10:26 am    Post subject: Re: probléme avec des classes templates pour liste chainées Reply with quote

Fabien LE LEZ wrote:
Quote:
On Fri, 27 Feb 2004 01:10:47 +0100, "Régis Troadec" wrote:


Généralement, le compilo en question n'admet pas que T soit un type avec le
mot-clé class dans ton argument de modèle .

Il faut généralement expliciter le fait que T soit un type en utilisant le
mot-clé typename.


Un compilo à éviter absolument donc...

ok merci,


donc pour être c++ clair , tu me dis que gcc n'est pas trés standard et
donc que la syntaxe n'est pas en faute...
alors si j'ai bien compris il me suffit de remplacer class par typename
dans mes templates?

@ bientôt

Back to top
Jean-Marc Bourguet
Guest





PostPosted: Fri Feb 27, 2004 10:47 am    Post subject: Re: probléme avec des classes templates pour liste chainées Reply with quote

farid b <fbouzema-nospam (AT) free (DOT) fr> writes:

Quote:
dans le but de me faire des classes génériques pour gérer des listes
chainées,j'ai adapté du code d'un bouquin cependant ça plante à la
compile avec pas mal d'erreur dont les plus graves à mon sens sont
le refus du compilateur de reconnaitre 2 classes templates. les
messages sont assez clair:

liste.hpp:5: déclaration de «class T»
liste.hpp:1: fait ombrage au paramètre du patron «class T»
liste.hpp:5: « debut » n'est pas un patron
liste.hpp:5: ISO C++ interdit la déclaration de « type name » sans type
liste.hpp:6: déclaration de «class T»
liste.hpp:1: fait ombrage au paramètre du patron «class T»
liste.hpp:6: « iterator » n'est pas un patron
liste.hpp:6: ISO C++ interdit la déclaration de « type name » sans type
liste.hpp:15: déclaration de «class T»
liste.hpp:12: fait ombrage au paramètre du patron «class T»
liste.hpp:15: « iterator » n'est pas un patron
liste.hpp:15: ISO C++ interdit la déclaration de « type name » sans type

je vous joint le listing complet (c'est pas trés long)
merci de votre aide...
template <class T
class list {
private:
list template <class T> friend class debut <T>;

1/ Change le T ici par un autre nom, il y a conflit de nom entre ce T
et celui qui parametre la classe list. De meme a la ligne suivant et
dans la classe debut.

2/ Supprime le <T> apres debut. De meme aux autres declarations friend.

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

Back to top
farid b
Guest





PostPosted: Fri Feb 27, 2004 10:49 am    Post subject: Re: probléme avec des classes templates pour liste chainées Reply with quote

farid b wrote:
Quote:
Fabien LE LEZ wrote:

On Fri, 27 Feb 2004 01:10:47 +0100, "Régis Troadec" <regt (AT) wanadoo (DOT) fr
wrote:


Généralement, le compilo en question n'admet pas que T soit un type
avec le
mot-clé class dans ton argument de modèle .

Il faut généralement expliciter le fait que T soit un type en
utilisant le
mot-clé typename.



Un compilo à éviter absolument donc...

ok merci,

donc pour être c++ clair , tu me dis que gcc n'est pas trés standard et
donc que la syntaxe n'est pas en faute...
alors si j'ai bien compris il me suffit de remplacer class par typename
dans mes templates?

@ bientôt

j'ai remplacé d'erreur....

Back to top
Jean-Marc Bourguet
Guest





PostPosted: Fri Feb 27, 2004 10:49 am    Post subject: Re: probléme avec des classes templates pour liste chainées Reply with quote

farid b <fbouzema-nospam (AT) free (DOT) fr> writes:

Quote:
Fabien LE LEZ wrote:
On Fri, 27 Feb 2004 01:10:47 +0100, "Régis Troadec" wrote:

Généralement, le compilo en question n'admet pas que T soit un type avec le
mot-clé class dans ton argument de modèle .

Il faut généralement expliciter le fait que T soit un type en utilisant le
mot-clé typename.
Un compilo à éviter absolument donc...

ok merci,

donc pour être c++ clair , tu me dis que gcc n'est pas trés standard et
donc que la syntaxe n'est pas en faute...

Si la syntaxe est en faute.

Quote:
alors si j'ai bien compris il me suffit de remplacer class par typename
dans mes templates?

Faut pas croire tout ce que disent les gens sur les forums (ce qui
s'applique peut-etre a moi: j'ai pas ete plus loin que d'utiliser
http://www.comeaucomputing.com/pcgi-bin/compiler.cgi pour verifie
qu'il y avait bien un probleme de ton code et pas de gcc).

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

Back to top
farid b
Guest





PostPosted: Fri Feb 27, 2004 11:25 am    Post subject: Re: probléme avec des classes templates pour liste chainées Reply with quote

Jean-Marc Bourguet wrote:
Quote:
farid b <fbouzema-nospam (AT) free (DOT) fr> writes:


dans le but de me faire des classes génériques pour gérer des listes
chainées,j'ai adapté du code d'un bouquin cependant ça plante à la
compile avec pas mal d'erreur dont les plus graves à mon sens sont
le refus du compilateur de reconnaitre 2 classes templates. les
messages sont assez clair:


liste.hpp:5: déclaration de «class T»
liste.hpp:1: fait ombrage au paramètre du patron «class T»
liste.hpp:5: « debut » n'est pas un patron
liste.hpp:5: ISO C++ interdit la déclaration de « type name » sans type
liste.hpp:6: déclaration de «class T»
liste.hpp:1: fait ombrage au paramètre du patron «class T»
liste.hpp:6: « iterator » n'est pas un patron
liste.hpp:6: ISO C++ interdit la déclaration de « type name » sans type
liste.hpp:15: déclaration de «class T»
liste.hpp:12: fait ombrage au paramètre du patron «class T»
liste.hpp:15: « iterator » n'est pas un patron
liste.hpp:15: ISO C++ interdit la déclaration de « type name » sans type

je vous joint le listing complet (c'est pas trés long)
merci de votre aide...
template <class T
class list {
private:
list template <class T> friend class debut <T>;


1/ Change le T ici par un autre nom, il y a conflit de nom entre ce T
et celui qui parametre la classe list. De meme a la ligne suivant et
dans la classe debut.

2/ Supprime le <T> apres debut. De meme aux autres declarations friend.

A+

désolé, est-ce que vous pouvez être + précis dans l'étape 1 quel T je

change...

@ plus

Back to top
Jean-Marc Bourguet
Guest





PostPosted: Fri Feb 27, 2004 12:17 pm    Post subject: Re: probléme avec des classes templates pour liste chainées Reply with quote

farid b <fbouzema-nospam (AT) free (DOT) fr> writes:

Quote:
Jean-Marc Bourguet wrote:
farid b <fbouzema-nospam (AT) free (DOT) fr> writes:

dans le but de me faire des classes génériques pour gérer des listes
chainées,j'ai adapté du code d'un bouquin cependant ça plante à la
compile avec pas mal d'erreur dont les plus graves à mon sens sont
le refus du compilateur de reconnaitre 2 classes templates. les
messages sont assez clair:


liste.hpp:5: déclaration de «class T»
liste.hpp:1: fait ombrage au paramètre du patron «class T»
liste.hpp:5: « debut » n'est pas un patron
liste.hpp:5: ISO C++ interdit la déclaration de « type name » sans type
liste.hpp:6: déclaration de «class T»
liste.hpp:1: fait ombrage au paramètre du patron «class T»
liste.hpp:6: « iterator » n'est pas un patron
liste.hpp:6: ISO C++ interdit la déclaration de « type name » sans type
liste.hpp:15: déclaration de «class T»
liste.hpp:12: fait ombrage au paramètre du patron «class T»
liste.hpp:15: « iterator » n'est pas un patron
liste.hpp:15: ISO C++ interdit la déclaration de « type name » sans type

je vous joint le listing complet (c'est pas trés long)
merci de votre aide...
template <class T
class list {
private:
list template <class T> friend class debut <T>;
1/ Change le T ici par un autre nom, il y a conflit de nom entre ce T
et celui qui parametre la classe list. De meme a la ligne suivant et
dans la classe debut.
2/ Supprime le <T> apres debut. De meme aux autres declarations friend.
A+

désolé, est-ce que vous pouvez être + précis dans l'étape 1 quel T je
change...

template <class T>
class list {
private:
list <T> *suivant;
template <class U> friend class debut;
....

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

Back to top
Fabien LE LEZ
Guest





PostPosted: Fri Feb 27, 2004 9:56 pm    Post subject: Re: probléme avec des classes templates pour liste chainées Reply with quote

On Fri, 27 Feb 2004 11:26:06 +0100, farid b <fbouzema-nospam (AT) free (DOT) fr>
wrote:

Quote:
donc pour être c++ clair , tu me dis que gcc n'est pas trés standard et
donc que la syntaxe n'est pas en faute...

Non. D'une part, je ne savais pas qu'il s'agissait de gcc ; d'autre
part, je n'ai pas lu le code incriminé.
Tout ce que j'ai dit, c'est qu'il me semble que "template<class T>" et
"template<typename T>" sont équivalents, et que donc un compilo qui
dit le contraire a un problème.

Note : comme le dit Jean-Marc, ne prends pas mes messages pour parole
d'évangile (cf ma signature), d'autant que je n'ai pas la norme sous
les yeux.

--
;-)

Back to top
Régis Troadec
Guest





PostPosted: Fri Feb 27, 2004 11:18 pm    Post subject: Re: probléme avec des classes templates pour liste chainées Reply with quote

Salut,

"farid b" <fbouzema-nospam (AT) free (DOT) fr> a écrit dans le message de news:
403f19f9$0$28131$636a15ce (AT) news (DOT) free.fr...
Quote:
Fabien LE LEZ wrote:
On Fri, 27 Feb 2004 01:10:47 +0100, "Régis Troadec" <regt (AT) wanadoo (DOT) fr
wrote:


Généralement, le compilo en question n'admet pas que T soit un type avec
le
mot-clé class dans ton argument de modèle .

Il faut généralement expliciter le fait que T soit un type en utilisant
le
mot-clé typename.


Un compilo à éviter absolument donc...

ok merci,

donc pour être c++ clair , tu me dis que gcc n'est pas trés standard et
donc que la syntaxe n'est pas en faute...

Heu...non, gcc est loin d'etre pas un compilo cassé, mais ma suggestion
initiale est due a ma lecture a la va-vite de ton post (il n'empeche que, le
jour ou t'auras ce genre d'erreurs et que ton code sera correct, alors le
passage class => typename sera une piste, ce ne sera pas une erreur, mais tu
utiliseras un compilo pourri )

Quote:
alors si j'ai bien compris il me suffit de remplacer class par typename
dans mes templates?

C'est ce que pensais au debut, mais en reprenant ton code, il y a qques
problemes :
pour compiler la declaration de list, il faut pour le compilo connaitre la
declaration de debut et de iterator
tu redeclares debut et iterator en classes parametrees (interfere en plus
avec le T de list) et en meme temps tu definis une relation d'amitie entre
ces classes et list (ca doit pas etre autorise ca)

template <class T>
class list {
private:
list <T> *suivant;
template <class T> friend class debut <T>;
template <class T> friend class iterator <T>;
public:

T data;
};

Je suggere :

// decl. anticipees
template<class T> class debut;
template<class T> class iterator;

template <class T> class list {
private:
list <T> *suivant;
friend class debut<T>;
friend class iterator<T>;

public:
T data;
};

et pareil pour la suite ...

Voila, p'tet que j'ai dit des conneries, mais je me ferai rappeler a l'ordre
par d'autres

Quote:

@ bientôt



Back to top
farid b
Guest





PostPosted: Sat Feb 28, 2004 12:53 am    Post subject: Re: probléme avec des classes templates pour liste chainées Reply with quote

Franck Branjonneau wrote:
Quote:
farid b <fbouzema-nospam (AT) free (DOT) fr> écrivait:


bonjour,

dans le but de me faire des classes génériques pour gérer des listes
chainées,j'ai adapté du code d'un bouquin
cependant ça plante à la compile avec pas mal d'erreur dont les plus
graves à mon sens sont le refus du compilateur de reconnaitre 2
classes templates.


je vous joint le listing complet (c'est pas trés long)
merci de votre aide...


template <class T> class debut;
template <class T> class iterator;


template <class T
class list {
private:
list template <class T> friend class debut <T>;

template <class T1> friend class debut;

template <class T> friend class iterator <T>;

template <class T1> friend class iterator;

public:

T data;
};


Idem pour la suite.
On y est presque mais il y a encore des problémes avec l'instantiation

de la classe iterator et donc dans mon main() il y a des variables qui
ne sont pas initialisée....

ps: je vous joins les messages d'erreur

qu'est-ce que c'est pas évident des relations d'amitiés entre patron de
classes......



liste.hpp: dans l'instanciation de « debut<double> »:
test.cpp:8: instancié à partir d'ici
liste.hpp:16: utilisation de « iterator » est ambiguë
liste.hpp:2: d'abord déclaré comme «template<class T> class iterator» ici
/usr/include/c++/3.2.2/bits/stl_iterator_base_types.h:102: aussi déclaré
comme «template<class _Category, class _Tp, class _Distance = ptrdiff_t,
class _Pointer = _Tp*, class _Reference = _Tp&> struct std::iterator» ici
liste.hpp:16: utilisation de « iterator » est ambiguë
liste.hpp:2: d'abord déclaré comme «template<class T> class iterator» ici
/usr/include/c++/3.2.2/bits/stl_iterator_base_types.h:102: aussi déclaré
comme «template<class _Category, class _Tp, class _Distance = ptrdiff_t,
class _Pointer = _Tp*, class _Reference = _Tp&> struct std::iterator» ici
liste.hpp: dans l'instanciation de « debut<char*> »:
test.cpp:10: instancié à partir d'ici
liste.hpp:16: utilisation de « iterator » est ambiguë
liste.hpp:2: d'abord déclaré comme «template<class T> class iterator» ici
/usr/include/c++/3.2.2/bits/stl_iterator_base_types.h:102: aussi déclaré
comme «template<class _Category, class _Tp, class _Distance = ptrdiff_t,
class _Pointer = _Tp*, class _Reference = _Tp&> struct std::iterator» ici
liste.hpp:16: utilisation de « iterator » est ambiguë
liste.hpp:2: d'abord déclaré comme «template<class T> class iterator» ici
/usr/include/c++/3.2.2/bits/stl_iterator_base_types.h:102: aussi déclaré
comme «template<class _Category, class _Tp, class _Distance = ptrdiff_t,
class _Pointer = _Tp*, class _Reference = _Tp&> struct std::iterator» ici
test.cpp: Dans function « int main() »:
test.cpp:20: utilisation de « iterator » est ambiguë
liste.hpp:2: d'abord déclaré comme «template<class T> class iterator» ici
/usr/include/c++/3.2.2/bits/stl_iterator_base_types.h:102: aussi déclaré
comme «template<class _Category, class _Tp, class _Distance = ptrdiff_t,
class _Pointer = _Tp*, class _Reference = _Tp&> struct std::iterator» ici
test.cpp:20: erreur d'analyse syntaxique avantle jeton « > »
test.cpp:21: utilisation de « iterator » est ambiguë
liste.hpp:2: d'abord déclaré comme «template<class T> class iterator» ici
/usr/include/c++/3.2.2/bits/stl_iterator_base_types.h:102: aussi déclaré
comme «template<class _Category, class _Tp, class _Distance = ptrdiff_t,
class _Pointer = _Tp*, class _Reference = _Tp&> struct std::iterator» ici
test.cpp:21: erreur d'analyse syntaxique avantle jeton « * »
test.cpp:24: « x » non déclaré (première utilisation dans cette fonction)
test.cpp:24: (Chaque identificateur non déclaré est rapporté seulement une
seule fois pour la fonction dans laquelle il apparaît.)
liste.hpp: At global scope:
liste.hpp: dans l'instanciation de « list<double> »:
test.cpp:24: instancié à partir d'ici
liste.hpp:5: utilisation de « iterator » est ambiguë
liste.hpp:2: d'abord déclaré comme «template<class T> class iterator» ici
/usr/include/c++/3.2.2/bits/stl_iterator_base_types.h:102: aussi déclaré
comme «template<class _Category, class _Tp, class _Distance = ptrdiff_t,
class _Pointer = _Tp*, class _Reference = _Tp&> struct std::iterator» ici
liste.hpp:5: utilisation de « iterator » est ambiguë
liste.hpp:2: d'abord déclaré comme «template<class T> class iterator» ici
/usr/include/c++/3.2.2/bits/stl_iterator_base_types.h:102: aussi déclaré
comme «template<class _Category, class _Tp, class _Distance = ptrdiff_t,
class _Pointer = _Tp*, class _Reference = _Tp&> struct std::iterator» ici
test.cpp: Dans function « int main() »:
test.cpp:31: « y » non déclaré (première utilisation dans cette fonction)
liste.hpp: At global scope:
liste.hpp: dans l'instanciation de « list<char*> »:
test.cpp:31: instancié à partir d'ici
liste.hpp:5: utilisation de « iterator » est ambiguë
liste.hpp:2: d'abord déclaré comme «template<class T> class iterator» ici
/usr/include/c++/3.2.2/bits/stl_iterator_base_types.h:102: aussi déclaré
comme «template<class _Category, class _Tp, class _Distance = ptrdiff_t,
class _Pointer = _Tp*, class _Reference = _Tp&> struct std::iterator» ici
liste.hpp:5: utilisation de « iterator » est ambiguë
liste.hpp:2: d'abord déclaré comme «template<class T> class iterator» ici
/usr/include/c++/3.2.2/bits/stl_iterator_base_types.h:102: aussi déclaré
comme «template<class _Category, class _Tp, class _Distance = ptrdiff_t,
class _Pointer = _Tp*, class _Reference = _Tp&> struct std::iterator» ici
liste.hpp: Dans member function « void debut<T>::add(T) [with T = double] »:
test.cpp:13: instancié à partir d'ici
liste.hpp:29: n'est pas un lvalue dans assignment
liste.hpp: Dans member function « void debut<T>::add(T) [with T = char*] »:
test.cpp:16: instancié à partir d'ici
liste.hpp:29: n'est pas un lvalue dans assignment

template <class T> class debut;
template <class T> class iterator;

template <class T>
class list {
private:
list<T> *suivant;
template <class T1> friend class debut;
template <class T1> friend class iterator;
public:

T data;
};

template <class T>
class debut {
list<T> * start;
template <class T1> friend class iterator;
public:
debut(void) {start=0;}
~debut(void);
void add(T t);
int ismember(T t);
};

template <class T>
void debut<T>::add(T t)
{list<T> *p=start, *q=start, *r;
while (!p=0) {q=p; p = p->suivant;}
r = new list<T>;
r->data = t;
r->suivant=0;
if(start) q->suivant = r;
else start = r;
}

template <class T>
int debut<T>::ismember(T t)
{list<T> *p = start , *q = start;
while (p!=0)
{ q = p;
p = p->suivant;
if(q->data==t) return 1;
}
return 0;
}

template <class T>
debut<T>::~debut(void)
{list<T> *p = start, *q;
while (p!=0)
{q = p;
p = p->suivant;
delete q;
}
start=0;
}

template <class T>
class iterator {
debut<T> *l;
list<T> *courant ;
public:
void reset() {courant = l->start;}
iterator (debut<T> *li) { l=li; reset();}
list<T> *suivant();
};

template <class T>
list<T> * iterator<T>::suivant(void)
{
list<T> *p = courant ;
if ( courant ) courant = courant->suivant;
return p;
}

// typedef debut<char *> list_string;
// typedef debut<double> list_double;
// typedef debut<int> list_int;
// typedef debut<char> list_char;
// typedef list<char *> * list_string_ptr;
// typedef list<double> * list_double_ptr;
// typedef list<int> * list_int_ptr;
// typedef list<char> * list_char_ptr;
// typedef iterator<char *> list_string_iterator;
// typedef iterator<double> list_double_iterator;
// typedef iterator<int> list_int_iterator;
// typedef iterator<char> list_char_iterator;

#include <iostream>
#include "liste.hpp"

using namespace std;

main ()
{
debut<double> number;
list<double>* p;
debut<char *> str;
list<char *>* q;

number.add(4.5);
number.add(5.7);
number.add(3.4);
str.add("Bonjourn");
str.add("C'est un ");
str.add("testn");

iterator<double> x(&number);
iterator<char *> y(&str);

cout << "Liste : " << endl;
while ((p=x.suivant())!=0) cout << " Données :" << p->data < if (number.ismember(4.5)) cout << "4.5 est dans la liste" << endl;
else cout << "4.5 n'est pas dans la liste" << endl;
if (number.ismember(4.999)) cout << "4.999 est dans la liste" << endl;
else cout << "4.999 n'est pas dans la liste" << endl;

cout << endl << "Liste :" << endl;
while ((q=y.suivant())!=0) cout << q->data;
}


Back to top
Franck Branjonneau
Guest





PostPosted: Sat Feb 28, 2004 7:18 pm    Post subject: Re: probléme avec des classes templates pour liste chainées Reply with quote

farid b <fbouzema-nospam (AT) free (DOT) fr> écrivait:

[ Quelques remarques ]

From: farid b <fbouzema-nospam (AT) free (DOT) fr>
Content-Type: multipart/mixed;

Aie. Ce n'est pas autorisé sur usenet.


Content-Type: text/plain; name="erreur_compil.txt"
Content-Disposition: inline;
filename="erreur_compil.txt"

liste.hpp: dans l'instanciation de « debut<double> »:
test.cpp:8: instancié à partir d'ici
liste.hpp:16: utilisation de « iterator » est ambiguë

Aie. Un encodage inconnu ; ISO8859-1 est autorisé, ISO8859-15 doit
passer.

N'hésite pas à cerner tes problèmes ; inutile de poster 75 lignes
d'erreur.



farid b <fbouzema-nospam (AT) free (DOT) fr> écrivait:
Quote:

On y est presque mais il y a encore des problémes avec l'instantiation
de la classe iterator et donc dans mon main() il y a des variables qui
ne sont pas initialisée....

qu'est-ce que c'est pas évident des relations d'amitiés entre patron
de classes......

Ton problème est ailleurs : lis les messages d'erreur de ton
compilateur.

Note que l'utilisation de using namespace std n'est pas conseillée.
--
Franck Branjonneau <fasbjx (AT) free (DOT) fr>

Back to top
Jean-Marc Bourguet
Guest





PostPosted: Sat Feb 28, 2004 7:45 pm    Post subject: Re: probléme avec des classes templates pour liste chainées Reply with quote

farid b <fbouzema-nospam (AT) free (DOT) fr> writes:

Quote:
using namespace std;

J'ai l'impression qu'il y a un conflit entre std::iterator et ton type
iterator. Vire cette ligne et qualifie explicitement avec std:: ce
qui est sensé venir de là.

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

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.