Déclaration d'amitié pour fonction générique.

Déclaration d'amitié pour fonction générique. - C++ - Programmation

Marsh Posté le 13-10-2005 à 14:24:28    

Hello,
 
   Voila j'ai un patron de classe Pile:

Code :
  1. template <class Type>
  2. class Pile
  3. {
  4.       friend ostream &operator<< <>(ostream &o, const Pile<Type> & );
  5.      
  6.       private :
  7.               Type *la_pile;
  8.               int sommet_pile;
  9.               const int MAX_PILE;
  10.       public :
  11.              //Constructeur
  12.              Pile();
  13.              //Constructeur
  14.              Pile(int);
  15.              //Destructeur
  16.              ~Pile();
  17.              //Methode qui empile
  18.              void empile(Type);
  19.              //Methode qui depile
  20.              void depile();
  21.              //Accesseur sur le sommet
  22.              Type sommet();
  23.              //Predicat  
  24.              int est_vide();
  25. };
  26. //La je suis vraiment pas sur
  27. template <class Type>
  28. ostream &operator<<(ostream &, const Pile<Type> & );


 
et donc je l'implemente :
 

Code :
  1. //Surcharge de l'operateur <<
  2. template <class Type>
  3. ostream &operator<<(ostream &o, const Pile<Type> &p)
  4. {
  5.         o << "elements de la pile : ";
  6.         for(int i = 0; i <= p.sommet_pile ; i++){
  7.                 o << p.la_pile[i] << " " ;
  8.         }
  9.         return o;
  10. }


 
Et quand je l'instancie (genre Pile<int> ...) le compilo me dit qu'il y a une erreur a la ligne :  
 

Code :
  1. friend ostream &operator<< <>(ostream &o, const Pile<Type> & );


 

Citation :


11 F:\...\Pile.hh template-id `operator<< <>' for `std::basic_ostream<char, std::char_traits<char> >& operator<<(std::basic_ostream<char, std::char_traits<char> >&, const Pile<int>& )' does not match any template declaration  


 
Je pige pas c'est quoi le probleme là ?


Message édité par Chronoklazm le 13-10-2005 à 14:25:14

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 13-10-2005 à 14:24:28   

Reply

Marsh Posté le 13-10-2005 à 14:40:43    

Reply

Marsh Posté le 13-10-2005 à 15:29:00    

Dakhor mais ça marche toujours pas :
 

Code :
  1. template <class Type>
  2. class Pile
  3. {
  4.       //Marche pas
  5.       //friend ostream &operator<< <>(ostream &o, const Pile<Type> & );  
  6.       private :
  7.               Type *la_pile;
  8.               int sommet_pile;
  9.               const int MAX_PILE;
  10.       public :
  11.              /* ... */
  12.              //??
  13.              void dump(ostream & ) const;             
  14. };
  15. template <class Type>
  16. inline ostream &operator<<( ostream &o, const Pile<Type> &p) { p.dump(o); return o; }


 

Code :
  1. //Dump
  2. template <class Type>
  3. void Pile<Type>::dump(ostream &o) const
  4. {
  5.         o << "elements de la pile : ";
  6.         for(int i = 0; i <= sommet_pile ; i++){
  7.                 o << la_pile[i] << " " ;
  8.         }
  9. }


 
Je suis sur la bonne voie ou pas ?


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 13-10-2005 à 15:30:05    

quoi marche pas ?

Reply

Marsh Posté le 13-10-2005 à 15:47:30    

Dsl j'ai oublié de précisé :  
 

Citation :


  [Linker error] undefined reference to `Pile<int>::Pile()'  
  [Linker error] undefined reference to `Pile<int>::dump(std::ostream& ) const'


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 13-10-2005 à 15:53:10    

[:pingouino]
 
de l'art de poser son probleme.  Bref, fous les définitions de fonctions dans ton .h et zou

Reply

Marsh Posté le 13-10-2005 à 15:55:44    

nan, je crois qu'il a gardait le code tel quel

Reply

Marsh Posté le 13-10-2005 à 15:59:12    

Pile.h

Code :
  1. // Fichier "Pile.h"
  2. // Declaration du patron Pile
  3. #include <cstdlib>
  4. #include <iostream>
  5. using namespace std;
  6. template <class Type>
  7. class Pile
  8. {
  9.       //Marche pas
  10.       //friend ostream &operator<< <>(ostream &o, const Pile<Type> & );  
  11.       private :
  12.               Type *la_pile;
  13.               int sommet_pile;
  14.               const int MAX_PILE;
  15.       public :
  16.              //Constructeur
  17.              Pile();
  18.              //Constructeur
  19.              Pile(int);
  20.              //Destructeur
  21.              ~Pile();
  22.              //Methode qui empile
  23.              void empile(Type);
  24.              //Methode qui depile
  25.              void depile();
  26.              //Accesseur sur le sommet
  27.              Type sommet();
  28.              //Predicat  
  29.              int est_vide();
  30.              //??
  31.              void dump(ostream &o) const;
  32.              
  33. };
  34. /*
  35. template <class Type>
  36. ostream &operator<<(ostream &, const Pile<Type> &p);
  37. */
  38. template <class Type>
  39. inline ostream &operator<<( ostream &o, const Pile<Type> &p) { p.dump(o); return o; }


 
Pile.cpp

Code :
  1. // Fichier "Pile.cpp"
  2. // Implementation du patron Pile
  3. #include <cstdlib>
  4. #include <iostream>
  5. #include "Pile.h"
  6. using namespace std;
  7. //Constructeur
  8. template <class Type>
  9. Pile<Type>::Pile() : MAX_PILE(50)
  10. {
  11.   la_pile = new Type[MAX_PILE];
  12.   sommet_pile = -1;
  13. }
  14. //Constructeur
  15. template <class Type>
  16. Pile<Type>::Pile(int max) : MAX_PILE(max)
  17. {
  18.   la_pile = new Type[MAX_PILE];
  19.   sommet_pile = -1;
  20. }
  21. //Destructeur
  22. template <class Type>
  23. Pile<Type>::~Pile()
  24. {
  25.   delete [] la_pile;
  26. }
  27. //Methode empile
  28. template <class Type>
  29. void Pile<Type>::empile(Type elt)
  30. {
  31.   sommet_pile++;
  32.   if(sommet_pile < MAX_PILE)
  33.    la_pile[sommet_pile] = elt;
  34.   else cerr << "Pile pleine ! " << endl;
  35. }
  36. //Methode depile   
  37. template <class Type>
  38. void Pile<Type>::depile()
  39. {
  40.   if(sommet_pile >= 0) sommet_pile--;
  41. }
  42. //Methode sommet
  43. template <class Type>
  44. Type Pile<Type>::sommet()
  45. {
  46.   return la_pile[sommet_pile];
  47. }
  48. //Predicat est_vide
  49. template <class Type>
  50. int Pile<Type>::est_vide()
  51. {
  52.   return (sommet_pile == -1) ? 1 : 0;
  53. }
  54. /*
  55. //Surcharge de l'operateur <<
  56. template <class Type>
  57. ostream &operator<<(ostream &o, const Pile<Type> &p)
  58. {
  59.         o << "elements de la pile : ";
  60.         for(int i = 0; i <= p.sommet_pile ; i++){
  61.                 o << p.la_pile[i] << " " ;
  62.         }
  63.         return o;
  64. }
  65. */
  66. //Dump
  67. template <class Type>
  68. void Pile<Type>::dump(ostream &o) const
  69. {
  70.         o << "elements de la pile : ";
  71.         for(int i = 0; i <= sommet_pile ; i++){
  72.                 o << la_pile[i] << " " ;
  73.         }
  74. }


 
main.cpp

Code :
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include "Pile.h"
  4. using namespace std;
  5. int main(int argc, char *argv[])
  6. {
  7.     Pile<int> p1, p2(5);
  8.     for(int i = 0; i<5; i++){
  9.          p1.empile(i);
  10.     }
  11.     while(p1.est_vide() == false){
  12.           p2.empile(p1.sommet());
  13.           cout << "On empile dans p2 " <<
  14.                p2.sommet() << endl;
  15.           p1.depile();
  16.     }
  17.     cout << p2;
  18.     system("PAUSE" );
  19.     return EXIT_SUCCESS;
  20. }


Message édité par Chronoklazm le 13-10-2005 à 15:59:34

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 13-10-2005 à 16:00:49    

...

Reply

Marsh Posté le 13-10-2005 à 16:01:48    

je propose std::stack

Reply

Marsh Posté le 13-10-2005 à 16:01:48   

Reply

Marsh Posté le 13-10-2005 à 16:02:51    

tu veux pas commencer par faire une classe template avec une seule fonction membre pour voir comment ça marche ?

Reply

Marsh Posté le 13-10-2005 à 16:03:08    

ouais

Reply

Marsh Posté le 13-10-2005 à 16:06:35    

J'ai gardé que le constructeur et ca me refait pareil : linker error


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 13-10-2005 à 16:07:38    

bon, disons
 
lors de la ocmpilation d'un fichier A, le compilo a besoin d'avoir non pas les declarations mais les definitions de TOUTES les fonctions template utilisée par A (et/ou les includes, enfin chipotons pas)

Reply

Marsh Posté le 13-10-2005 à 16:08:00    

fais ce que je t'ai dit d'abord. C'est pas la peine de nous coder 500 lignes et de la péter avec des friends si t'es pas capable de faire une classe de 3 lignes.

Reply

Marsh Posté le 13-10-2005 à 16:31:55    

Mais heuu ...
Bon j'ai tout mis dans un seul fichier .
 

Code :
  1. #include <cstdlib>
  2. #include <iostream>
  3. using namespace std;
  4. template <class Type>
  5. class Pile
  6. {
  7.       private :
  8.               Type *la_pile;
  9.               int sommet_pile;
  10.               const int MAX_PILE;
  11.       public :
  12.              Pile() : MAX_PILE(50)
  13.              {
  14.                    la_pile = new Type[MAX_PILE];
  15.                    sommet_pile = -1;
  16.              };
  17.              //Constructeur
  18.              Pile(int max) : MAX_PILE(max)
  19.              {
  20.                 la_pile = new Type[MAX_PILE];
  21.                 sommet_pile = -1;
  22.              };
  23.              //Destructeur
  24.              ~Pile()
  25.              {
  26.                delete [] la_pile;
  27.              };
  28.              //Empiler
  29.              void empile(Type elt)
  30.              {
  31.                sommet_pile++;
  32.                if(sommet_pile < MAX_PILE)
  33.                  la_pile[sommet_pile] = elt;
  34.                else cerr << "Pile pleine ! " << endl;
  35.              };
  36.              //Depiler
  37.              void depile()
  38.              {
  39.                if(sommet_pile >= 0) sommet_pile--;
  40.              };
  41.            
  42.              Type sommet()
  43.              {
  44.                return la_pile[sommet_pile];
  45.              };
  46.            
  47.              int est_vide()
  48.              {
  49.                return (sommet_pile == -1) ? 1 : 0;
  50.              };
  51.            
  52.              void dump(ostream &o) const
  53.              {
  54.                      o << "elements de la pile : ";
  55.                      for(int i = 0; i <= sommet_pile ; i++){
  56.                      o << la_pile[i] << " " ;
  57.              };
  58. };
  59. template <class Type>
  60. ostream & operator<<( ostream &o, const Pile<Type> &p) { p.dump(o); return o; };
  61. int main(int argc, char *argv[])
  62. {
  63.     Pile<int> p1;
  64.     system("PAUSE" );
  65.     return EXIT_SUCCESS;
  66. };


 

Citation :


main.cpp:62: error: declaration of `class Type'
main.cpp:5: error:  shadows template parm `class Type'
main.cpp:63: error: `std::ostream& Pile<Type>::operator<<(std::ostream&, const Pile<Type>& )' must take exactly one argument
 
main.cpp:70: error: expected `}' at end of input
 
main.cpp:70: error: expected unqualified-id at end of input
main.cpp:70: error: expected `;' at end of input
 
make.exe: *** [main.o] Error 1


 
C'est quoi le delire la ?


Message édité par Chronoklazm le 13-10-2005 à 16:34:04

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 13-10-2005 à 16:51:54    

juste comme ça, tout mettre dans le même fichier, ça veut pas dire tout mettre inline.

Reply

Marsh Posté le 13-10-2005 à 17:11:56    

Puutéén tout ca a cause d'une parenthese de merde. J'y crois pas.
 
Taz : ok merci


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 13-10-2005 à 17:21:36    

ce qu'on fait d'habitude :
- 1 .h (ou .hpp) avec les déclarations et les inline (la routine)
- 1 .tpp que tu inclues dans le .hpp qui contient les définitions des codes templates.

Reply

Sujets relatifs:

Leave a Replay

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