Partage
  • Partager sur Facebook
  • Partager sur Twitter

Surcharge de std::ostringstream::operator<<

29 mars 2008 à 10:53:26

Salut,

J'essaye de surcharger la méthode std::ostringstream::operator<< mais je n'y arrive pas.
  1. std::ostringstream& operator<<(std::ostringstream& os, ZString& string)
  2. {
  3.     os << string.getChaine();
  4.     return os;
  5. }


Avec l'erreur :
error : no match for "operator<<" in "oss << data"

Merci de vos réponses
  • Partager sur Facebook
  • Partager sur Twitter
29 mars 2008 à 11:08:23

  1. #include <ostream>
  2. std::ostream& operator<<(std::ostream& flux, const ZString& string)
  3. {
  4.     flux << string.getChaine();
  5.     return flux;
  6. }


Il suffit de le fair une fois pour tous les flux sortant de cettte manière.

Si tu n'as pas mis les const à la in de tes fonctions membres, enlève le const que j'ai mis.
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
29 mars 2008 à 11:10:38

J'ai déjà redéfini cette méthode. Mais l'erreur y ai quand même
  • Partager sur Facebook
  • Partager sur Twitter
29 mars 2008 à 11:19:45

tu pourais redonner l'erreur et la ligne stp
  • Partager sur Facebook
  • Partager sur Twitter
29 mars 2008 à 11:24:27

  1. #include "ZString.hpp"
  2. ZString::ZString()
  3. {
  4.     m_longueur = 0;
  5. }
  6. template <typename T>
  7. ZString::ZString(T data)
  8. {
  9.     std::ostringstream oss;
  10.     oss << data;
  11.     copie(oss.str().c_str(), m_chaine);
  12. }
  13. ZString::ZString(const ZString& autre)
  14. {
  15.     copie(autre.m_chaine, m_chaine);
  16. }
  17. void ZString::copie(const char* chaine, char*& copie)
  18. {
  19.     delete[] copie;
  20.     m_longueur = longueur(chaine);
  21.     copie = new char[m_longueur+1];
  22.     for(int i = 0; chaine[i] != '\0'; i++)
  23.         copie[i] = chaine[i];
  24.     copie[m_longueur] = '\0';
  25. }
  26. char* ZString::getChaine()
  27. {
  28.     return m_chaine;
  29. }
  30. int ZString::size()
  31. {
  32.     return m_longueur;
  33. }
  34. template <typename T>
  35. ZString ZString::operator+(const T data)
  36. {
  37.     std::ostringstream oss, oss2;
  38.     oss << data;
  39.     m_longueur += oss.str().size();
  40.     oss2 << m_chaine << data;
  41.     copie(oss2.str().c_str(), m_chaine);
  42.     ZString res(m_chaine);
  43.     return res;
  44. }
  45. /*int* ZString::nb_chiffre(int value)
  46. {
  47.     long size=0,result=1;
  48.     m_longueur = 0;
  49.         while(result!=0) {
  50.                 result = floor(value/pow(10,size+1));
  51.                 m_longueur++;
  52.                 size++;
  53.         }
  54.         int *tab = new int[size];
  55.         for(int i=0;i<size;i++) {
  56.                 tab[i] = floor(value/pow(10,size-(i+1)))-floor(value/pow(10,size-i))*10;
  57.         }
  58.         return tab;
  59. }
  60. char* ZString::intToChar(int nb)
  61. {
  62.     int* tab_chiffre = nb_chiffre(nb);
  63.     char* retour = new char[m_longueur+1];
  64.     for(int i = 0; i < m_longueur; i++)
  65.     {
  66.         switch(tab_chiffre[i])
  67.         {
  68.             case 0:
  69.                 retour[i] = '0';
  70.                 break;
  71.             case 1:
  72.                 retour[i] = '1';
  73.                 break;
  74.             case 2:
  75.                 retour[i] = '2';
  76.                 break;
  77.             case 3:
  78.                 retour[i] = '3';
  79.                 break;
  80.             case 4:
  81.                 retour[i] = '4';
  82.                 break;
  83.             case 5:
  84.                 retour[i] = '5';
  85.                 break;
  86.             case 6:
  87.                 retour[i] = '6';
  88.                 break;
  89.             case 7:
  90.                 retour[i] = '7';
  91.                 break;
  92.             case 8:
  93.                 retour[i] = '8';
  94.                 break;
  95.             case 9:
  96.                 retour[i] = '9';
  97.                 break;
  98.         }
  99.     }
  100.     retour[m_longueur] = '\0';
  101.     return retour;
  102. }*/
  103. int ZString::longueur(const char* chp)
  104. {
  105.     std::ostringstream oss;
  106.     oss << chp;
  107.     return oss.str().size();
  108. }


L'erreur :
error : no match for 'operator<<' in 'oss << data'

ET j'essaye de résoudre l'erreur comme ceci :
  1. #ifndef MYOSTREAM
  2. #define MYOSTREAM
  3. class ZString;
  4. std::ostream& operator<<(std::ostream& os, ZString& string)
  5. {
  6.     os << string.getChaine();
  7.     return os;
  8. }
  9. std::ostringstream& operator<<(std::ostringstream& os, ZString& string)
  10. {
  11.     os << string.getChaine();
  12.     return os;
  13. }
  14. #endif


Sachant que myostream.hpp est défini apres ZString.hpp
  • Partager sur Facebook
  • Partager sur Twitter
29 mars 2008 à 11:28:30

premierement, implemente op+() en fonction libre, ensuite une fonction template doit etre definis à sa déclaration (donc soit tu mets le code dans le .hpp ou tu passes par un .inl, cf FAQ de developpez)

edit: et comme la dit Nanoc, std::ostringstream herite de std::ostream, donc pas besoin de redefinir
  • Partager sur Facebook
  • Partager sur Twitter