Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1603 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Listes template : Problème

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Listes template : Problème

n°968607
maximew
Coffee and cigarettes and Cate
Posté le 01-02-2005 à 17:05:12  profilanswer
 

Bonjour,
 
Je cherche à implémenter une Liste patron (dans un but didactique, sinon, j'aurais pris la STL) afin qu'elle soit la plus réutilisable possible.
Cependant, j'ai un petit problème. Tout d'abord la déclaration de la classe (ce n'est encore qu'une ébauche) :
 

Code :
  1. template <class T> struct Element
  2. {
  3.         struct Element* m_Next;
  4.         T m_Data;
  5. };
  6. template <class T> class List
  7. {
  8.         private:
  9.                 struct Element<T>* m_First;
  10.         public:
  11.                 List();
  12.                 virtual ~List();
  13.                 void empty();
  14.                 void add(T);
  15.                 friend ostream& operator<< (ostream&,const List<class T>& );
  16. };


 
et le code incriminé:

Code :
  1. void template <class T> List<T>::add(T t)
  2. {
  3.         struct Element<T>* e = new struct Element<T>;
  4.         e->m_Next = m_First;
  5.         e->m_Data = t;
  6.         m_First = e;
  7. }


 
Dans ma fonction main, j'essaye d'instancier une liste de int, mais à chaque fois que je déclare une struct Element<T>* e, C++ Builder 4 me renvoie l'erreur : "La spécialisation explicite de Element<int> nécessite une déclaration template<>".
Si quelqu'un pouvait m'aider, ce serait vraiment sympa, parce que là, les templates, c'est la première fois que j'en utilise vraiment et je ne vois pas trop ce que signifie cette erreur... Merci!


Message édité par maximew le 01-02-2005 à 17:12:05

---------------
Mon Flickr
mood
Publicité
Posté le 01-02-2005 à 17:05:12  profilanswer
 

n°968655
++fab
victime du syndrome IH
Posté le 01-02-2005 à 18:01:09  profilanswer
 

hum, y a pas mal d'erreurs ...
la syntaxe de la déclaration d'une fonction membre, c'est plutot ça :

Code :
  1. template <class T>
  2. void List<T>::add(T t) // ou const T&
  3. {
  4.         Element<T>* e = new Element<T>; //pas besoin de struct comme en C
  5.         e->m_Next = m_First;
  6.         e->m_Data = t;
  7.         m_First = e;
  8. }


 
en supposant que tu ai besoin de friend ... je pense que tu veux plutot faire ça :

Code :
  1. template <class V> friend ostream& operator<< (ostream&,const List<V>& );


 
De plus, empty doit probablement etre const. Le destructeur virtuel, mmouais.

n°968682
maximew
Coffee and cigarettes and Cate
Posté le 01-02-2005 à 18:56:04  profilanswer
 

J'ai résolu le problème en mettant la structure Element au sein même de la classe List.
empty n'est pas const, puique par nature, il vide la liste... Le destructeur en tant que membre virtuel n'est-il pas invariable?


---------------
Mon Flickr
n°968692
++fab
victime du syndrome IH
Posté le 01-02-2005 à 19:16:28  profilanswer
 

maximew a écrit :

J'ai résolu le problème en mettant la structure Element au sein même de la classe List.
empty n'est pas const, puique par nature, il vide la liste... Le destructeur en tant que membre virtuel n'est-il pas invariable?


 
un destructeur virtuel, c'est pour une classe [EDIT] d'interface [\EDIT]. C'est pas ton cas.
clear() me parait plus parlant que empty() quand meme.


Message édité par ++fab le 01-02-2005 à 19:52:15
n°968754
maximew
Coffee and cigarettes and Cate
Posté le 01-02-2005 à 20:40:06  profilanswer
 

Ok, bien compris... J'avais pourtant l'habitude de mettre systèmatiquement le destructeur en virtuel afin de ne pas avoir de problème en cas de dérivation et transtypages multiples, d'autant plus que j'ai lu ceci dans certains livres... Faudrait que je me penche la dessus...
Merci pour ton aide!


---------------
Mon Flickr
n°968756
Taz
bisounours-codeur
Posté le 01-02-2005 à 20:42:44  profilanswer
 

++fab a écrit :

un destructeur virtuel, c'est pour une classe [EDIT] d'interface [\EDIT]. C'est pas ton cas.
clear() me parait plus parlant que empty() quand meme.

N'importe quoi. Dès qu'une classe s'inscrit dans une relation d'héritage -> destructeur virtuel. .|

n°968778
++fab
victime du syndrome IH
Posté le 01-02-2005 à 21:42:29  profilanswer
 

est ce que le fait de ne pas fournir un destructeur virtuel dans une classe (qui n'hérite de rien), revient à interdire d'en hériter ?
pour éviter les fuites, ça parait obligé :o
Taz> OK

n°968781
Taz
bisounours-codeur
Posté le 01-02-2005 à 21:50:30  profilanswer
 

ça n'interdit rien du tout, c'est juste un beau bordel.

n°968802
++fab
victime du syndrome IH
Posté le 01-02-2005 à 22:28:06  profilanswer
 

ça fait froid dans le dos le C++ parfois.

n°968806
Taz
bisounours-codeur
Posté le 01-02-2005 à 22:32:06  profilanswer
 

fais comme moi : apprends le forth

mood
Publicité
Posté le 01-02-2005 à 22:32:06  profilanswer
 

n°968825
++fab
victime du syndrome IH
Posté le 01-02-2005 à 22:47:52  profilanswer
 

en langage fonctionel, j'en suis encore à balbutier mon E-Lisp :/ Apres, j'ai prévu de suivre la migration des GNU vers Scheme. Apres ce périple, pourquoi pas :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Listes template : Problème

 

Sujets relatifs
2 Listes déroulantes liés avec un input en plus...[Applet signée] problême ouverture de fichier [résolut mais...]
Problème <span>probleme avec sendAndLoad et tabulation
pitit probleme avec un treeview[java] Probleme pour afficher une image
Problème include de fichier [résolu][VB.NET] Probleme de lancement d'une applet
[Résolu] Problème de requête[Resolu] [Mysql]Probleme d'insertion de string avec des anti slashs
Plus de sujets relatifs à : Listes template : Problème


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR