2016-05-17 7 views
0

In meiner Klasse, überlastete ich den Betreiber < < umErreichen voll funktions Verschiebung Stromsyntax

MyObject << something1 << something2; 

friend const std::string& operator<<(Logger& os, const std::string& msg); 

zu erreichen, aber ich kann einfach tun:

MyObject < < something1;

Wenn ich den zweiten Stream-Eingang (something2) hinzufügen, bekomme ich einen Compiler-Fehler, der mir sagt, dass es keinen Operator für solche wie Eingabe gibt.

Meine Frage ist also: Wie kann ich die beabsichtigte Syntax erreichen?

Antwort

2

<< muss den Stream (als Referenz) zurückgeben. Mit anderen Worten, es sollte sein erstes (linkes) Argument zurückgeben.

os << v1 << v2 als (os << v1) << v2 geparst, um für den äußereen Anruf desselben überladenen Operator zu verwenden, um das Ergebnis von os << v1 besser gleich wie die Art der os.

+0

Also bin ich gezwungen, os zu behandeln? Wenn ich MyObject als Referenz zurückgebe, habe ich das gleiche Problem. – harryPoker

+0

Ist 'MyObject' ein' Logger' oder etwas anderes? Und was meinst du mit "handle" "os". Alles, was Sie tun müssen, ist, es so wie es ist zurückzugeben. – rici

+0

Dank rici, ich habe es durch die Definition tat: Freund Logger & operator << (Logger & einzuloggen, const std :: string & msg); So, jetzt kann ich schreiben: MyObject << "msg 1" << msg 2" ; All davon ohne einen Strom in meiner Argumentliste zu haben. – harryPoker

0

Ok, ich habe das Problem gefunden. Ich muss MyObject als Referenz zurückgeben:

friend Logger& operator<<(Logger& os, const std::string& msg);