[C++/gcc 3.2.3] Template, petit bout de code qui ne fonctionne pas

Template, petit bout de code qui ne fonctionne pas [C++/gcc 3.2.3] - C++ - Programmation

Marsh Posté le 08-11-2003 à 11:43:27    

Hello,  
 
Au risque de m'afficher, ca doit être qqchose aussi gros que moi, le code suivant ne compile pas :
 

Code :
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std ;
  4. template< class T >
  5. void afficheVector(const vector<T> &vec) {
  6. vector<T>::const_iterator iter;   // ligne 9
  7. for(iter = vec.begin() ;  iter != vec.end() ; iter++)
  8.  cout << *iter << ' ' ;
  9. cout << endl ;
  10. }
  11. int main(int argc, char* argv[]) {
  12. vector<int> v ;
  13. for (int i = 0 ; i < 10 ; i++)
  14.  v.push_back(i) ;
  15. afficheVector(v) ;
  16. }


 
Voici les erreurs :
 


$ make
g++ -c main.cpp -Wall -pedantic  
main.cpp: In function `void afficheVector(const std::vector<T,  
   std::allocator<_CharT> >& )':
main.cpp:9: syntax error before `;' token
main.cpp: In function `void afficheVector(const std::vector<T,  
   std::allocator<_CharT> >& ) [with T = int]':
main.cpp:24:   instantiated from here
main.cpp:11: `iter' undeclared (first use this function)
main.cpp:11: (Each undeclared identifier is reported only once for each  
   function it appears in.)
make: *** [main.o] Error 1
$  
 


 
Erreur de syntaxe ? Je vois vraiment pas, ou ca fait trop longtemps que je suis devant mon écran.
Par contre, tout passe bien lorsque la ligne 9 devient :
 

Code :
  1. vector<int>::const_iterator iter;   // ligne 9


 
Ce qui a relativement peu d'intérêt [:ddr555]. Il y surement qqchose qui m'a échappé :|
 
Merci à vous !


Message édité par Evadream -jbd- le 08-11-2003 à 16:15:41
Reply

Marsh Posté le 08-11-2003 à 11:43:27   

Reply

Marsh Posté le 08-11-2003 à 11:45:47    

template< class T >  
void afficheVector<T>(const vector<T> &vec) {


Message édité par chrisbk le 08-11-2003 à 11:46:12
Reply

Marsh Posté le 08-11-2003 à 11:50:11    

Je n'avais jamais vu cette syntaxe, mais ca passe pas non plus, toujours les mêmes erreurs.

Reply

Marsh Posté le 08-11-2003 à 11:51:40    

rah chui con :O
dis donc :O
 
>afficheVector(v) ;  
 
 
skoi de ca ? :O
 
afficheVector<int>(v) ;

Reply

Marsh Posté le 08-11-2003 à 11:55:17    

Ca fonctionne pas :D
 
Toujours cette erreur de syntaxe à la ligne 9 avec une autre à la ligne 8 :
 


main.cpp:8: partial specialization `afficheVector<T>' of function template


 
Et puis ca me semble bizarre de devoir spécifier le type à l'appel dans un cas aussi simple, ou il n'y a pas d'ambiguité, non ?


Message édité par Evadream -jbd- le 08-11-2003 à 11:56:56
Reply

Marsh Posté le 08-11-2003 à 11:57:28    

ben ecoute je viens d'essayer ca compile sous VC++ :D
 
(copier coller de ton code)
 
donc je sais pas :O


Message édité par chrisbk le 08-11-2003 à 11:58:50
Reply

Marsh Posté le 08-11-2003 à 12:00:52    


$ g++ --version
g++ (GCC) 3.2.3 20030422 (Gentoo Linux 1.4 3.2.3-r2, propolice)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$  


 
Ca viendrait du compilateur à priori alors ? Une syntaxe particulière ou un truc comme çà. Je vais chercher dans cette direction !  
 
Merci de ton intervention !
 
Si qqun d'autre à des propositions, pas de soucis :)
 
@+


Message édité par Evadream -jbd- le 08-11-2003 à 12:01:23
Reply

Marsh Posté le 08-11-2003 à 12:44:49    

Mon code initial compile sans warnings avec gcc/++ 2.96. Je pense que ca provient d'un problème d'include. J'ai reesayé de compiler mon code avec #include <iterator> mais ca fonctionne pas :D

Reply

Marsh Posté le 08-11-2003 à 13:30:07    

essaye avec
 

Code :
  1. template< typename T >
  2. void afficheVector(const vector<T> &vec) {


 

Reply

Marsh Posté le 08-11-2003 à 15:56:20    

Code :
  1. #include <iostream>
  2. #include <vector>
  3. #include <iterator>
  4. using namespace std ;
  5. template< typename T >
  6. void afficheVector(const vector<T> &vec) {
  7. vector<T>::const_iterator iter; // ligne 9
  8. for(iter = vec.begin() ;  iter != vec.end() ; iter++) {
  9.   cout << *iter << ' ' ;
  10. }
  11. cout << endl ;
  12. }
  13. int main(int argc, char* argv[]) {
  14. vector<int> v ;
  15. for (int i = 0 ; i < 10 ; i++)
  16.  v.push_back(i) ;
  17. afficheVector(v) ;
  18. }


 
Résultat de la compilation :
 


$ make
g++ -c main.cpp -Wall -pedantic  
main.cpp: In function `void afficheVector(const std::vector<T,  
   std::allocator<_CharT> >& )':
main.cpp:9: syntax error before `;' token
main.cpp: In function `void afficheVector(const std::vector<T,  
   std::allocator<_CharT> >& ) [with T = int]':
main.cpp:24:   instantiated from here
main.cpp:11: `iter' undeclared (first use this function)
main.cpp:11: (Each undeclared identifier is reported only once for each  
   function it appears in.)
make: *** [main.o] Error 1
$


 
Still the same :|

Reply

Marsh Posté le 08-11-2003 à 15:56:20   

Reply

Marsh Posté le 08-11-2003 à 22:58:33    

Evadream -jbd- a écrit :

Code :
  1. vector<T>::const_iterator iter; // ligne 9



 
la règle: quand on fait référence à un type contenu dans une classe template, il faut toujours mettre typename devant:

Code :
  1. typename vector<T>::const_iterator iter; // ligne 9


 
(le compilo ne peut pas savoir que const_iterator est bien un type et pas autre chose)

Reply

Marsh Posté le 08-11-2003 à 23:53:36    

Whouaou ! C'est exactement çà ! Un grand merci pour l'explication en plus de la solution !
 
@+

Reply

Sujets relatifs:

Leave a Replay

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