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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1222118
Chronoklaz​m
Posté le 13-10-2005 à 14:24:28  profilanswer
 

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 !
mood
Publicité
Posté le 13-10-2005 à 14:24:28  profilanswer
 

n°1222131
Taz
bisounours-codeur
Posté le 13-10-2005 à 14:40:43  profilanswer
 
n°1222199
Chronoklaz​m
Posté le 13-10-2005 à 15:29:00  profilanswer
 

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 !
n°1222204
Taz
bisounours-codeur
Posté le 13-10-2005 à 15:30:05  profilanswer
 

quoi marche pas ?

n°1222233
Chronoklaz​m
Posté le 13-10-2005 à 15:47:30  profilanswer
 

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 !
n°1222244
chrisbk
-
Posté le 13-10-2005 à 15:53:10  profilanswer
 

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

n°1222251
Taz
bisounours-codeur
Posté le 13-10-2005 à 15:55:44  profilanswer
 

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

n°1222260
Chronoklaz​m
Posté le 13-10-2005 à 15:59:12  profilanswer
 

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 !
n°1222266
Taz
bisounours-codeur
Posté le 13-10-2005 à 16:00:49  profilanswer
 

...

n°1222269
chrisbk
-
Posté le 13-10-2005 à 16:01:48  profilanswer
 

je propose std::stack

mood
Publicité
Posté le 13-10-2005 à 16:01:48  profilanswer
 

n°1222270
Taz
bisounours-codeur
Posté le 13-10-2005 à 16:02:51  profilanswer
 

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

n°1222271
Taz
bisounours-codeur
Posté le 13-10-2005 à 16:03:08  profilanswer
 

ouais

n°1222278
Chronoklaz​m
Posté le 13-10-2005 à 16:06:35  profilanswer
 

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 !
n°1222279
chrisbk
-
Posté le 13-10-2005 à 16:07:38  profilanswer
 

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)

n°1222281
Taz
bisounours-codeur
Posté le 13-10-2005 à 16:08:00  profilanswer
 

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.

n°1222303
Chronoklaz​m
Posté le 13-10-2005 à 16:31:55  profilanswer
 

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 !
n°1222332
Taz
bisounours-codeur
Posté le 13-10-2005 à 16:51:54  profilanswer
 

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

n°1222350
Chronoklaz​m
Posté le 13-10-2005 à 17:11:56  profilanswer
 

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 !
n°1222358
Taz
bisounours-codeur
Posté le 13-10-2005 à 17:21:36  profilanswer
 

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.


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

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

 

Sujets relatifs
Fonction qui modifie un char *[Probleme] Pointeurs de fonction dans une map
Fonction MySQL désapprouvé[C++] pbl d'appel de fonction
fonction qui retourne nb jours entre 2 datesfonction mail ?
fonction "trier par" dans une listeMethode toString() générique, introspection.
Problème envoi mail avec fonction mail() [Résolu]fonction pour recuperer un chiffre d'une chaine [Résolu]
Plus de sujets relatifs à : Déclaration d'amitié pour fonction générique.


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