Probleme de surcharge operateur <<

Probleme de surcharge operateur << - C++ - Programmation

Marsh Posté le 20-06-2009 à 17:49:39    

Je cherche a mettre en place une gestion de paramètres personnalisés au milieu des stringstream ( ou des ostream ).
 
Donc j'ai mis en place ce test pour constater la détection d'une valeur personnalisable :  
 

Code :
  1. #include <iostream>
  2. typedef enum
  3. {
  4. param
  5. } PARAM;
  6.   // surcharge 1
  7. std::ostream& operator<< ( std::ostream &o, PARAM param )
  8. {
  9. std::cout << " test de ( std::ostream &o, PARAM param ) " << std::endl;
  10. return o;
  11. }
  12.   // surcharge 2
  13. std::ostream& operator<< ( PARAM param, std::ostream &o  )
  14. {
  15. std::cout << " test de ( PARAM param, std::ostream &o  ) " << std::endl;
  16. return o;
  17. }
  18. int main()
  19. {
  20. PARAM p = param;
  21. std::stringstream s( " chaine de test " );
  22. std::cout << "debut " << s.str() << p << " fin" << std::endl;
  23.     return 0;
  24. }


 
Probleme, la surcharge 1 sur s.str() << p se déclenche effectivement bien, mais par contre ce qui m'interresse vraiment c de récupere la chaine qui vien apres "p", et la c le drame, je n'arrive pas a déclencher la surcharge 2, soit p << " fin" ...  
Donc je suppose que je m'y prend mal, comment dois je surcharger l'operateur << a ce niveau la ???

Reply

Marsh Posté le 20-06-2009 à 17:49:39   

Reply

Marsh Posté le 20-06-2009 à 17:58:04    

2 trucs :
1/ Pas sur que tu puisse surcharger les operator d'une enum. il faut que ton PARAM soit lui même une classe avec un operator<< qui gére les éléments qui lui succédent.
2/ Sinon, pour que ca marche, ton 1er parametre de operator<< devrait etres un PARAM&


Message édité par Joel F le 20-06-2009 à 17:59:53
Reply

Marsh Posté le 20-06-2009 à 18:43:40    

En fait si c'est possible car si j'ajoute ceci  
 

Code :
  1. p << s;


 
ca déclenche bien la surcharge 2. Y'a juste qu'apparement elle refuse de se déclencher si y'a deja eu un ostream précédement dans la liste des surcharges.. J'y pige rien.

Reply

Marsh Posté le 20-06-2009 à 20:36:40    

Voila ce qui se passe :

Code :
  1. os << p << "toto";


 
est résolu comme:

Code :
  1. (os << p) << "toto";


 
Or le (os<<p) renvoit un ostream et donc tu ne peut pas activer la bonne surcharge.
Mates comment std::hex et cie sont implantés.

Reply

Marsh Posté le 20-06-2009 à 20:38:14    

Code :
  1. std::cout << "debut " << s.str() << p << " fin" << std::endl;


est à interpréter comme

Code :
  1. ((((std::cout << "debut" ) << s.str()) << p) << "fin" ) << std::endl;


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 20-06-2009 à 23:53:01    

difficile de comprendre simplement comment sont implémenté les parametres des streams vu le fouillis que c'est dans les headers de la STL. Est-ce que quelqu'un serai en mesure de me fournir un résumé ?

Reply

Marsh Posté le 21-06-2009 à 08:36:00    

Je ne comprends ta question... en passant, à part pour des choses simplissimes, regarder l'implémentation d'une bibliothèque pour comprendre comment l'utiliser n'est pas une bonne solution.
 
Si le contenu des bouquins d'introduction ou des références généralistes (Stroustrup, Jossutis) ne te suffit pas, la référence sur les streams, c'est Standard C++ IOStreams and Locales, Langer et Kreft, Addison-Wesley.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Sujets relatifs:

Leave a Replay

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