Fehler im Stream [gelöst]
-
Hallo,
ich habe hier ein Prog mit einem Stream und alles compiliert und läuft. Der Code in der letzten Zeile ist auskommentiert. "myStream() << my;" Aber genau diesen Code brauche ich. Der gcc ist schwer am motzen, wenn er diesen Code sieht. Unter VC compiliert alles problemlos;#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. o << "<myStream>"; return stream; } myStream& operator<<(const char* m) { o << m; return *this; } private: ostringstream o; }; // manipulator function inline myStream& operator<<(myStream& stream, myStream& (*function)(myStream&) ) { return (*function)(stream); } int main() { myStream o; o << my; o << "y"; o << "z" << my; myStream() << "" << my << my << "" << my; // myStream() << my; // erzeugt untenstehenden error im gcc } /* 35: error: no match for 'operator<<' in 'myStream() << my' 16: note: candidates are: myStream& myStream::operator<<(const char*) 23: note: myStream& operator<<(myStream&, myStream& (*)(myStream&)) */Bin für jeden Tip dankbar
tschüß
Troll.Soft
-
Das Problem könnte sein, dass
myStream()kein LValue ist und somit fürmyals Parameter nicht in Frage kommt. Frag mich aber bitte nicht, was den GCC dazu bewegt, den Sachverhalt beimyStream() << ""anders zu sehen.
-
ipsec schrieb:
Frag mich aber bitte nicht, was den GCC dazu bewegt, den Sachverhalt bei
myStream() << ""anders zu sehen.Man darf temporäre Objekte zwar nicht als nichtkonstante Referenz an eine Funktion übergeben, aber man darf deren non-const Memberfunktionen aufrufen (also auch operator<<(const char*)).
Dass man das const auf diese Weise ganz leicht wegbekommt, war mir gar nicht bewusst... und ob das im Sinne der Erfinder war, weiß ich auch nicht.
-
Wenn ich den Code so erweitere
ostringstream& my2(ostringstream& stream) { stream << "<my2Stream>"; return stream; } int main() { myStream o; o << my; o << "y"; o << "z" << my; myStream() << "" << my << my << "" << my; // myStream() << my; ostringstream() << "hicks"; ostringstream() << my; // 38: warning: the address of 'myStream& my(myStream&)' will always evaluate as 'true' }compiliert der gcc durch, allerdings mit einer Warnung. Irgendwie muß man da doch tricksen können, so das es geht.

tschüß
Troll.Soft
-
Kannst du schon, du musst operator<<(myStream&(*)(myStream&)) halt nur auch mit in die Klasse nehmen.
-
Athar schrieb:
Kannst du schon, du musst operator<<(myStream&(*)(myStream&)) halt nur auch mit in die Klasse nehmen.
Wenn ich diesen Code in die Klasse mit reinnehme
myStream& operator<<(myStream&(*)(myStream&) ) { o << "hi fan"; return *this; }compiliert alles durch und
myStream() << my;liefert den fan aus, aber dann wird dieser Code
myStream o; o << my;bemängelt mit
L:/code/html/main_html_test_stream_iostream/main_html_test_stream_iostream.cpp:34: error: ambiguous overload for 'operator<<' in 'o << my'
Brauche weitere Anregungen
tschüß
Troll.Soft
-
Wenn du den operator<< in die Klasse reinnimmst, muss die globale Funktion entsprechend weg.
-
Athar schrieb:
Wenn du den operator<< in die Klasse reinnimmst, muss die globale Funktion entsprechend weg.
Oh je, da hatte ich wohl etwas mißverstanden. Aber juchhe, nach korrekter Ausführung Deines Vorschlages funktioniert es. Hier ist der Code.
#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. o << "<myStream>"; return stream; } myStream& operator<<(const char* m) { o << m; return *this; } // manipulator function inline myStream& operator<<(myStream& (*function)(myStream&) ) { return (*function)(*this); } private: ostringstream o; }; int main() { myStream o; o << my; o << "y"; o << "z" << my; myStream() << "" << my << my << "" << my; myStream() << my; }danke
Troll.Soft