Le problème est que std::endl est un modèle de fonction, l'opérateur<<
est. Donc, lorsque vous écrivez:
my_stream << endl;
vous aimerez le compilateur de déduire les paramètres du modèle pour l'opérateur
ainsi que pour endl. Ce n'est pas possible.
Donc, vous avez à écrire d'autres, non du modèle, surcharge de l'opérateur<< pour
travailler avec les manipulateurs. Leur prototype va ressembler:
UIStream& operator<<(UIStream& os, std::ostream& (*pf)(std::ostream&));
(il y en a deux autres, en remplacement de std::ostream par std::basic_ios et
std::ios_base, que vous avez également à fournir si vous le souhaitez, permet à tous les
les manipulateurs) et leur mise en œuvre sera très similaire à celui de
votre modèle. En fait, si semblables que vous pouvez utiliser votre modèle pour
mise en œuvre comme ceci:
typedef std::ostream& (*ostream_manipulator)(std::ostream&);
UIStream& operator<<(UIStream& os, ostream_manipulator pf)
{
return operator<< <ostream_manipulator> (os, pf);
}
Une dernière remarque, souvent écrit une coutume streambuf est souvent un meilleur moyen de
réaliser ce qu'on essaie de réaliser l'application de la technique que vous utilisez.