[C++] STL list

STL list [C++] - C++ - Programmation

Marsh Posté le 12-12-2004 à 01:08:13    

je cherche à faire un truc tout simple
 
j'ai une classe représenté par un Tableau de list de TYPE
 
Tableau< list<TYPE> > tab;
 
lorsque j'essaye de me créer un itérateur de list
list<TYPE>::iterator iter;
 
ca merde royalement, avec ce genre d'erreur
error: dependent-name ` std::list<TYPE,std::allocator<_CharT> >::iterator' is parsed as a non-type, but instantiation yields a type
note: say `typename  std::list<TYPE,std::allocator<_CharT> >::iterator' if a type is meant
 
pourtant si je remplace TYPE par int dans la création de l'itérateur, ca fonctionne, alors je me dis qu'il doit manquer quelque chose dans ma classe TYPE (classe Enveloppe en réalité) pour pouvoir me créer mon itérateur

Reply

Marsh Posté le 12-12-2004 à 01:08:13   

Reply

Marsh Posté le 12-12-2004 à 01:17:30    

refile donc nous un peu plus de contexte

Reply

Marsh Posté le 12-12-2004 à 01:23:30    

J'ai du construire une classe Tableau qui est un tableau dynamique. Il s'agrandit au besoin et tout le tralala.
 
Là je fais une classe Hachage, qui implante un tableau d'adressage dispersé via un tableau dynamique dont chaque élément est une liste, ceci dans le but de gérer les collisions.
 
Dans ma classe Hachage, j'ai donc:

Code :
  1. template <typename TYPE>
  2. class Hachage {
  3.   private:
  4.     Tableau< list<TYPE> > tab;
  5.   public:
  6.     bool contient(TYPE& t);
  7. };
  8. template <typename TYPE>
  9. bool Hachage<TYPE>::contient(TYPE& t) {
  10.   unsigned int hv(t.hash());
  11.   list<TYPE>::iterator iter;
  12.   return false;
  13. }


 
je veux me créer un itérateur pour parcourir ma liste, et trouver l'élément recherché
 
dans mon cas, je me sers de ma classe Hachage à l'aide d'objet Enveloppe. Une enveloppe est un objet qui contient une clé et une valeur.
 
en parcourant ma liste, je rechercherais donc une enveloppe qui a la même clé que "t", un objet de type Enveloppe lui aussi, qui contient une enveloppe avec une clé mais sans valeur attribué


Message édité par burgergold le 12-12-2004 à 01:24:32
Reply

Marsh Posté le 12-12-2004 à 02:08:46    

typename

Reply

Marsh Posté le 12-12-2004 à 02:17:54    


 
 :??:

Reply

Marsh Posté le 12-12-2004 à 02:38:50    

j'en ai marre de faire des sujets que personne ne lit ...

Reply

Marsh Posté le 12-12-2004 à 02:44:21    

Taz a écrit :

j'en ai marre de faire des sujets que personne ne lit ...


 
si fallait que chacun dise ce dont il a marre de toi...
 
j'avais fait ma recherche sur "list"
 
là jviens de déterrer ton vieux topic sur les typename, jvois pas vraiment  quel est le lien avec mon problème de list :/
 
http://forum.hardware.fr/forum2.ph [...] 0&subcat=0

Reply

Marsh Posté le 12-12-2004 à 02:57:23    

je pense que taz te propose un:
 

Code :
  1. 1. template <typename TYPE>
  2.    2. class Hachage {
  3.    3.   private:
  4.    4.     Tableau< list<TYPE> > tab;
  5.    5.   public:
  6.           typedef typename list<TYPE>::iterator list_iterator;
  7.    6.     bool contient(TYPE& t);
  8.    7. };
  9.    8.
  10.    9. template <typename TYPE>
  11.   10. bool Hachage<TYPE>::contient(TYPE& t) {
  12.   11.   unsigned int hv(t.hash());
  13.   12.
  14.   13.   list_iterator iter;
  15.   14.
  16.   15.   return false;
  17.   16. }

Reply

Marsh Posté le 12-12-2004 à 03:01:40    

bjone a écrit :

je pense que taz te propose un:
 

Code :
  1. 1. template <typename TYPE>
  2.    2. class Hachage {
  3.    3.   private:
  4.    4.     Tableau< list<TYPE> > tab;
  5.    5.   public:
  6.           typedef typename list<TYPE>::iterator list_iterator;
  7.    6.     bool contient(TYPE& t);
  8.    7. };
  9.    8.
  10.    9. template <typename TYPE>
  11.   10. bool Hachage<TYPE>::contient(TYPE& t) {
  12.   11.   unsigned int hv(t.hash());
  13.   12.
  14.   13.   list_iterator iter;
  15.   14.
  16.   15.   return false;
  17.   16. }




 
ahh bien voila, ca compile :)
 
bon maintenant cherchons à comprendre :D
 
en quoi est-ce différent? je comprends ce que le typedef fait, mais jvois pas en quoi c'est différent d'utiliser le tout par à l'aide d'un typedef ou de le faire directement dans ma méthode :/
 
le topic a taz a bien des exemples mais pas vraiment d'explication sur le "pourquoi" utiliser le typedef

Reply

Marsh Posté le 12-12-2004 à 03:03:46    

c'est le typename qui permet de dire au compilo "plus tard on aura besoin de ça, même si ça existe pas encore"
 
enfin je comprends l'ensemble typedef/typename comme ça. (définition d'un type à partir d'un type encore non défini)

Reply

Marsh Posté le 12-12-2004 à 03:03:46   

Reply

Marsh Posté le 12-12-2004 à 03:08:50    

bjone a écrit :

c'est le typename qui permet de dire au compilo "plus tard on aura besoin de ça, même si ça existe pas encore"
 
enfin je comprends l'ensemble typedef/typename comme ça. (définition d'un type à partir d'un type encore non défini)


 
mais encore? pk est-ce que la déclaration de mon itérateur dans la méthode ne peut fonctionner?

Reply

Marsh Posté le 12-12-2004 à 03:13:46    

passque il doit y avoir une limite de "cascade" ou "dépendance" (ou je sais pas comment dire) au niveau de l'analyse de la template, ce qui implique que list<TYPE> passe mais list<TYPE>::quelque_chose ne passera pas.
 
je n'ai pas étudié la compilation de template, mais je suppose que le compilo la maintiens d'une certaine manière qu'il doit être capable de pseudo-résoudre les dépendances, et le typename sert à cette pseudo-résolution, en disant "oué là y'a un truc qui existera plus tard".


Message édité par bjone le 12-12-2004 à 03:14:29
Reply

Marsh Posté le 13-12-2004 à 12:46:08    

Bonjour,
 
j'ai posté récemment des questions sur ce forum au sujet des difficultés que j'avais à utiliser STL avec la version 6.0 de Visual C++. Je n'avais pas ces problèmes avec gcc sous linux, et, d'après ce que j'ai su par la suite, ces problèmes ne se recontraient pas avec la version 7.0 de Visual.
 
Pour mon information, peut tu me dire, Burgergold, quel type de compilateur tu utilises ?

Reply

Marsh Posté le 13-12-2004 à 13:00:42    

c'était avec gcc 3.4.3

Reply

Marsh Posté le 13-12-2004 à 13:13:45    

Ah, OK, autant pour moi !
Ton problème ne devait donc pas être lié, comme pour moi, au type de compilateur !
Merci de ta réponse.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed