probleme template

probleme template - C++ - Programmation

Marsh Posté le 10-04-2005 à 14:57:16    

bonjour,
je debute en c++ et j'ai un petit probleme avec la compilation des templates ( j'utilise dev C++, donc compilateur gcc si je ne me trompe)  
 
j'ai voulu tester de faire un "extends" de la classe list fournie. mais il me fait un probleme au niveau des iterators.
 

Citation :


ListeObjets.cpp In member function `T* ListeObjets<T>::getObjet(int)':  
17 ListeObjets.cpp expected `;' before "it"
18 ListeObjets.cpp `it' undeclared (first use this function)  
......


 
 
plus precisément voici le code qui pose probleme (le .cpp)
 

Code :
  1. #include <iostream>
  2. #include "ListeObjets.h"
  3. // Constructeur
  4.   template <class T>
  5.   ListeObjets<T>::ListeObjets() {
  6.   }             
  7.   // Destructeur
  8.   template <class T>
  9.   ListeObjets<T>::~ListeObjets(){
  10.   }             
  11.   // Accesseurs
  12.   template <class T>
  13.   T * ListeObjets<T>::getObjet(int numero) {
  14.     list<T>::iterator it = _liste.begin();
  15.     for(int n=numero; n > 0; n--) it++;
  16.     return *it;
  17.   }
  18.  
  19.   // Méthodes
  20.   template <class T>
  21.   void ListeObjets<T>::ajouterObjet(T *o) {
  22.     push_back(o);
  23.   }
  24.  
  25.   template <class T>
  26.   void ListeObjets<T>::retirerObjet(int numero) {
  27.     list<T>::iterator i = _liste.begin();
  28.     for(int n=numero; n > 0; n--) i++;
  29.     _liste.erase(i);
  30.   }


 
 
est ce que j'ai un probleme dans mon code ou est ce que c'est le compilateur gcc qui gere pas les templates ?  
 
 
Merci d'avance

Reply

Marsh Posté le 10-04-2005 à 14:57:16   

Reply

Marsh Posté le 10-04-2005 à 15:03:02    

Je te dis juste pour visual studio :
Quand tu fais une class template ce dernier refuse le découpage fichier .h déclaration et .cpp définitions
 
Donc sous Visual Studio, tu dois crée ta class et tes focntions dns un .h unique (donc çà fait un gros fichier .h et c'est  tout pas beau :S)

Reply

Marsh Posté le 10-04-2005 à 16:18:12    

La syntaxe correcte est :
typename std::list<T>::iterator it = _liste.begin();

Reply

Marsh Posté le 10-04-2005 à 16:47:14    

C'est ce que j'allais dire (ouais, on dit toujours ça :)). J'ai l'impression que manutudescend a coupé le message d'erreur de gcc qui indiquait qu'il fallait utiliser le mot-clé typename. Comme on l'a vu récemment là:
http://forum.hardware.fr/forum2.ph [...] 1#t1037810

Reply

Marsh Posté le 10-04-2005 à 16:48:07    

Tarabiscote a écrit :

La syntaxe correcte est :
typename std::list<T>::iterator it = _liste.begin();


bien vu  :bounce:  
Sinon tu peux metter après tes includes

Code :
  1. using std::list ;


 
Cela évite de taper "std::" avant chaque occurence de list
Mais dans ces cas là tu t'interdit de définir quoi que ce soit (objet ou variable) de non list

Reply

Marsh Posté le 10-04-2005 à 16:53:06    

Personnellement, je conseil pas trop d'utiliser using dans un fichier d'en-tête.
(ca peut poser problème si ce fichier est inclu un peu partout)

Reply

Marsh Posté le 10-04-2005 à 17:53:47    

j'ai mis dans le .h using std::list ;
et le message d'erreur n'est pas coupé.
je vais essayer typename stf::list...... mais je doute que ca vienne de la. je vous tiens au courant ;)
merci

Reply

Marsh Posté le 10-04-2005 à 18:04:05    

vous etes sur pour le 'typename' ? Le compilateur connait std::list et sais que iterator est un type membre ?
 
ne mets pas de using dans un entete, et tu es sur d'avoir inclus <list> ?

Reply

Marsh Posté le 10-04-2005 à 18:54:05    

merci j'ai utilisé la syntaxe  
typename std::list<T>::iterator it = _liste.begin();
et ca marche ;)
merci pour votre aide a tous .

Reply

Marsh Posté le 10-04-2005 à 19:08:44    

c'est pas comme si y avait un topic exprès sur typename

Reply

Sujets relatifs:

Leave a Replay

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