Listes template : Problème

Listes template : Problème - C++ - Programmation

Marsh Posté le 01-02-2005 à 17:05:12    

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
Reply

Marsh Posté le 01-02-2005 à 17:05:12   

Reply

Marsh Posté le 01-02-2005 à 18:01:09    

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.

Reply

Marsh Posté le 01-02-2005 à 18:56:04    

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
Reply

Marsh Posté le 01-02-2005 à 19:16:28    

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
Reply

Marsh Posté le 01-02-2005 à 20:40:06    

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
Reply

Marsh Posté le 01-02-2005 à 20:42:44    

++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. .|

Reply

Marsh Posté le 01-02-2005 à 21:42:29    

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

Reply

Marsh Posté le 01-02-2005 à 21:50:30    

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

Reply

Marsh Posté le 01-02-2005 à 22:28:06    

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

Reply

Marsh Posté le 01-02-2005 à 22:32:06    

fais comme moi : apprends le forth

Reply

Marsh Posté le 01-02-2005 à 22:32:06   

Reply

Marsh Posté le 01-02-2005 à 22:47:52    

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 :)

Reply

Sujets relatifs:

Leave a Replay

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