stream will noch nicht so, wie ich will
-
moin,
ich habe eine Klasse "class myStream" die auch fröhlich streamt. Folgende Konstruktion stößt auf einen Compilererror unter gcc:
myStream() << " hallo "; // Fehlermeldung no match for 'operator<<' in 'myStream() << " hallo "'
Brauche einen Tip.
tschüß
Troll.Soft#include <sstream> #include <iostream> using namespace std; class myStream; myStream& my(myStream&); class myStream { public: myStream() {} ~myStream() { cout << "start " << o.str() << " ende"; } friend myStream& my(myStream& stream) { stream << "<myStream>"; return stream; } friend myStream& operator<<(myStream& stream, const char* S) { stream.o << S; return stream; } string str() const { return o.str(); } private: ostringstream o; }; // manipulator function inline myStream& operator<<(myStream& stream, myStream& (*function)(myStream&) ) { return (*function)(stream); } int main() { myStream MyStream; MyStream << " hallo " << my << " hallo " << my; myStream() << " hallo " << my << " hallo " << my; // mit VC2008 ok // mit gcc error: no match for 'operator<<' in 'myStream() << " hallo "' cout << MyStream.str(); }
-
Weil myStream() ein Funktionsaufruf ist. Und keine Ueberladung existiert, die mittels << irgendwas in die Funktion piped.
-
knivil schrieb:
Weil myStream() ein Funktionsaufruf ist. Und keine Ueberladung existiert, die mittels << irgendwas in die Funktion piped.
Aber es muss eine Trick geben, denn wenn ich direkt von ostringstream ableite meckert gcc nicht mehr über "myStream() << my;", gibt aber ein Warnung heraus.
Man braucht also noch einen Trick.
Hier ist der Code nur mit Warnung:#include <sstream> #include <iostream> using namespace std; class myStream; myStream& my(myStream&); class myStream : public ostringstream { public: myStream() : ostringstream() {} ~myStream() { cout << " start " << str() << " ende "; } friend myStream& my(myStream& stream) { stream << "<myStream>"; return stream; } }; // manipulator function inline myStream& operator<<(myStream& stream, myStream& (*function)(myStream&) ) { return (*function)(stream); } int main() { myStream() << my; // warning: the address of 'myStream& my(myStream&)' will always evaluate as 'true' }tschüß
Troll.Soft
-
Meine erste Erklaerung ist wahrscheinlich falsch. Jedoch funktioniert dein zweites Beispiel auch nicht korrekt, bei mir ist <stream> nicht in der Ausgabe zwischen start und ende. Was den Trick betrifft: Ich wuerde nie so programmieren. Einfach Konstruktion und Benutzung des Objektes trennen.
-
knivil schrieb:
bei mir ist <stream> nicht in der Ausgabe zwischen start und ende.
Ja, da kommt die Warnung zum Tragen und es wird nur "true" ausgegeben.
Ich will ja nicht unbedingt von ostringstream ableiten. Mir reicht der Trick mit dem ostringstream diese Konstruktion "myStream()" zum Laufen bringt.tschüß
Troll.Soft