Surcharge stream operator [Résolu]

Joan_Andre 8 Messages postés jeudi 6 septembre 2007Date d'inscription 3 mars 2009 Dernière intervention - 26 févr. 2009 à 22:09 - Dernière réponse : Joan_Andre 8 Messages postés jeudi 6 septembre 2007Date d'inscription 3 mars 2009 Dernière intervention
- 3 mars 2009 à 15:27
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;

}
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscription 6 octobre 2018 Dernière intervention - 1 mars 2009 à 01:35
3
Merci
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;
}

Merci cptpingu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de cptpingu
Joan_Andre 8 Messages postés jeudi 6 septembre 2007Date d'inscription 3 mars 2009 Dernière intervention - 2 mars 2009 à 15:36
0
Merci
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.
Commenter la réponse de Joan_Andre
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscription 6 octobre 2018 Dernière intervention - 2 mars 2009 à 17:18
0
Merci
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;
}
Commenter la réponse de cptpingu
Joan_Andre 8 Messages postés jeudi 6 septembre 2007Date d'inscription 3 mars 2009 Dernière intervention - 3 mars 2009 à 15:27
0
Merci
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.
Commenter la réponse de Joan_Andre

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.