Surcharge stream operator [Résolu]

Signaler
Messages postés
8
Date d'inscription
jeudi 6 septembre 2007
Statut
Membre
Dernière intervention
3 mars 2009
-
Messages postés
8
Date d'inscription
jeudi 6 septembre 2007
Statut
Membre
Dernière intervention
3 mars 2009
-
Bonjour,

Quelqu un pourrait il m expliquer la raison pour laquelle le code ci dessous ne fonctionne pas (je ne parviens pas a faire "entrer" le std::end dans le streaming. J ai aussi essaye avec ostream& comme argument d operator).

Merci d avance.

#include

#include <string>

using namespace std;

class OutClasse

{

public:

OutClasse& operator << (string);

OutClasse& operator << (int);

OutClasse& operator << (ostream);

};

OutClasse& OutClasse::operator << (string sChaine)

{

std::cout << sChaine;

return *this;

};

OutClasse& OutClasse::operator << (int sChaine)

{

std::cout << sChaine;

return *this;

};

OutClasse& OutClasse::operator << (ostream sChaine)

{

std::cout << sChaine;

return *this;

};

main()

{

OutClasse a;

a << "salut" << std::endl;

}

4 réponses

Messages postés
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
121
Il faut savoir que std::endl n'est pas une constante, mais une fonction templaté, donc tu peux essayer ceci:

#include
#include <sstream>

class OutClasse
{
public:
  OutClasse& operator<<(const std::string& sChaine);
  OutClasse& operator<<(int sChaine);
  OutClasse& operator<< (std::ostream& sChaine);
};

OutClasse&
OutClasse::operator<<(const std::string& sChaine)
{
  std::cout << sChaine;

  return *this;
};

OutClasse&
OutClasse::operator<<(int sChaine)
{
  std::cout << sChaine;
  return *this;
};

OutClasse&
OutClasse::operator<< (std::ostream& sChaine)

{
  std::cout << sChaine;

  return *this;
};

OutClasse&
operator<<(OutClasse& out,
       std::ostream& (*fn)(std::ostream&))
{
  std::ostringstream oss;
  fn(oss);
  out << oss.str();
  return out;
}

int
main()
{
  OutClasse a;
  a << "salut" << std::endl;
}
Messages postés
8
Date d'inscription
jeudi 6 septembre 2007
Statut
Membre
Dernière intervention
3 mars 2009

Merci, c est vraiment la solution a mon probleme. Je n aurais vraiment pas pu imaginer cela tout seul.

Histoire de ne pas me laisser porter mais d essayer de comprendre l information que je viens de recevoir, une idee de lecture pour m aider a hisser mes connaissances a ce niveau ? Je pense avoir lu la litterature standard necessaire pour etre << serieux >> en C++ mais la, il semble qu il y a une specialite (certainement plusieurs) qui me fait defaut.

Merci encore.
Messages postés
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
121
Lorsque tu fais un :
std::endl, il devine tout seul les templates nécessaires, et te met automatiquement un: std::endl<char, char_traits<char> >.
Comme un endl est une fonction templaté, pour qu'il accepte de le prendre en argument de operator<<, j'ai dit à operator de prendre un pointeur sur fonction, dont la signature pourrait correspondre à std::endl.

Maintenant, bien que cette solution fonctionne, quelques remarques:
- std::endl est à manier avec précaution. std::endl équivaut à: '\n' << std::flush
Ce qui peut nuire au preformance. Un simple '\n' est donc souvent à préconiser.
- std::endl peut être remplacer pour éviter cela. Par exemple avec un std::nl (fait maison :p):

namespace std
{
  template <class charT, class traits>
  basic_ostream<charT, traits>&
  nl(basic_ostream<charT, traits>& os)
  {
#ifdef __WIN32__
    os << "\r\n";
#else
    os << '\n';
#endif
    return os;
  }
}

int main()
{
  OutClasse a;
  a << "salut" << std::nl;
}
Messages postés
8
Date d'inscription
jeudi 6 septembre 2007
Statut
Membre
Dernière intervention
3 mars 2009

Bon, visiblement il faut que j etudie serieusement les << basic template member >> d une part et les << traits mechanisms >> d autre part. Ca me dit quelque chose mais cela doit faire tres longtemps...

En tout cas merci. Non seulement, mon probleme specifique est resolu mais en plus j ai un bon point de depart pour cerner mes lacunes et y remedier.