Joan_Andre
Messages postés8Date d'inscriptionjeudi 6 septembre 2007StatutMembreDernière intervention 3 mars 2009
-
26 févr. 2009 à 22:09
Joan_Andre
Messages postés8Date d'inscriptionjeudi 6 septembre 2007StatutMembreDernière intervention 3 mars 2009
-
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).
Joan_Andre
Messages postés8Date d'inscriptionjeudi 6 septembre 2007StatutMembreDernière intervention 3 mars 2009 2 mars 2009 à 15:36
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.
cptpingu
Messages postés3840Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention23 août 2024126 2 mars 2009 à 17:18
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;
}
Joan_Andre
Messages postés8Date d'inscriptionjeudi 6 septembre 2007StatutMembreDernière intervention 3 mars 2009 3 mars 2009 à 15:27
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.