 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
farid b Guest
|
Posted: Thu Feb 26, 2004 10:07 pm Post subject: probléme avec des classes templates pour liste chainées |
|
|
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
|
Posted: Fri Feb 27, 2004 12:10 am Post subject: Re: probléme avec des classes templates pour liste chainées |
|
|
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
|
Posted: Fri Feb 27, 2004 7:42 am Post subject: Re: probléme avec des classes templates pour liste chainées |
|
|
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
|
Posted: Fri Feb 27, 2004 10:23 am Post subject: Re: probléme avec des classes templates pour liste chainées |
|
|
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
|
Posted: Fri Feb 27, 2004 10:26 am Post subject: Re: probléme avec des classes templates pour liste chainées |
|
|
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
|
Posted: Fri Feb 27, 2004 10:47 am Post subject: Re: probléme avec des classes templates pour liste chainées |
|
|
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
|
Posted: Fri Feb 27, 2004 10:49 am Post subject: Re: probléme avec des classes templates pour liste chainées |
|
|
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
|
Posted: Fri Feb 27, 2004 10:49 am Post subject: Re: probléme avec des classes templates pour liste chainées |
|
|
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
|
Posted: Fri Feb 27, 2004 11:25 am Post subject: Re: probléme avec des classes templates pour liste chainées |
|
|
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
|
Posted: Fri Feb 27, 2004 12:17 pm Post subject: Re: probléme avec des classes templates pour liste chainées |
|
|
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
|
Posted: Fri Feb 27, 2004 9:56 pm Post subject: Re: probléme avec des classes templates pour liste chainées |
|
|
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
|
Posted: Fri Feb 27, 2004 11:18 pm Post subject: Re: probléme avec des classes templates pour liste chainées |
|
|
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
|
|
| Back to top |
|
 |
farid b Guest
|
Posted: Sat Feb 28, 2004 12:53 am Post subject: Re: probléme avec des classes templates pour liste chainées |
|
|
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
|
Posted: Sat Feb 28, 2004 7:18 pm Post subject: Re: probléme avec des classes templates pour liste chainées |
|
|
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
|
|
| Back to top |
|
 |
|
|
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
|
|