Linker Error C2679 (VC++) mit std::endl und "<<" Operator
-
Wenn du sowieso nur alles an cout weiterleitest, warum machst du kein Template draus?
-
oder klar:
template<typename T> Foo& operator<<(const T& val) { cout<<val; return *this; }(das schluckt alles, was auch cout aufnehmen könnte)
Alternativ kannst du dich ja durch die iostream-Header durchkämpfen und nachschlagen, wie endl genau definiert ist

-
MFK schrieb:
Wenn du sowieso nur alles an cout weiterleitest, warum machst du kein Template draus?
Das ist eine sehr berechtigte Frage. Weil ich derzeit lediglich zur Ausgabenprüfung /-verarbeitung konstante Zeiger vom Typ char und Zahlen vom Typ int verwende bzw. es provisorisch erst nur so gelöst habe. Komforttechnisch würde es sich natürlich anbieten.
-
CStoll schrieb:
oder klar:
template<typename T> Foo& operator<<(const T& val) { cout<<val; return *this; }(das schluckt alles, was auch cout aufnehmen könnte)
Bis auf std::endl;

CStoll schrieb:
Alternativ kannst du dich ja durch die iostream-Header durchkämpfen und nachschlagen, wie endl genau definiert ist

Tja, das wollte ich ursprünglich vermeiden. Naja los gehts...
-
HaJo. schrieb:
CStoll schrieb:
oder klar:
template<typename T> Foo& operator<<(const T& val) { cout<<val; return *this; }(das schluckt alles, was auch cout aufnehmen könnte)
Bis auf std::endl;

echt? in dem Fall bleibt dir nur die genauerer Suche - oder du schreibst statt endl halt "\n" raus, sollte in den meisten Fällen auch reichen.
PS: Was ist mit folgendem?
Foo::operator ostream&() { return cout; }
-
CStoll schrieb:
echt? in dem Fall bleibt dir nur die genauerer Suche - oder du schreibst statt endl halt "\n" raus, sollte in den meisten Fällen auch reichen.
Ich habe nicht brauchbares in den Headern finden können. In der MSDN ist der Operator mit folgenden Überladungen angegeben.
ostream& operator <<( ostream& (*fcn)(ostream&) ); ostream& operator <<( ios& (*fcn)(ios&) );Damit kann ich aber nichts anfangen. Was für ein Funktionsparameter wird hier erwartet? Eine Referenz einer Referenz gecastet auf einen Zeiger vom Typ Funktion?
CStoll schrieb:
PS: Was ist mit folgendem?
Foo::operator ostream&() { return cout; }Hier verstehe ich den Sinn gerade nicht.
Also das meine Klasse impliziet auf ostream& gecastet wird, wozu?Habe nun eine Funktion namens endl implementiert
std::ostream & endl (void) { return std::cout << std::endl; }Das gefällt mir aber überhaupt nicht.
-
HaJo. schrieb:
ostream& operator <<( ostream& (*fcn)(ostream&) ); ostream& operator <<( ios& (*fcn)(ios&) );Damit kann ich aber nichts anfangen. Was für ein Funktionsparameter wird hier erwartet? Eine Referenz einer Referenz gecastet auf einen Zeiger vom Typ Funktion?
Das ist ein Funktionszeiger, von einer Funktion die ostream& als Parameter übernimmt und ostream& zurückgibt. Vermutlich tut der operator<< von ostream nichts anderes als genau diese Funktion mit this aufzurufen:
ostream& operator<<(ostream& (*fcn)(ostream&)) { return fcn(*this); }Aber ob man sich auf all das verlassen sollte, ist die nächste Frage (Stichwort Implementationsabhängigkeit)
-
LordJaxom schrieb:
ostream& operator<<(ostream& (*fcn)(ostream&)) { return fcn(*this); }Aber ob man sich auf all das verlassen sollte, ist die nächste Frage (Stichwort Implementationsabhängigkeit)
Habe es jetzt so gelöst:
std::ostream & operator <<(std::ostream& (*fcn)(std::ostream&)) { return std::cout << *fcn; }Sicher sollte es doch eigentlich sein. Ich werde es warscheinlich nur nicht mit dem G++ auf einem Linuxsystem kompilieren können, denn fcn ist ja sicher nicht in der STL definiert. Gleich mal schaun.
-
Und das geht durch den Compiler?
(Was kommt eigentlich raus wenn man einen Funktionspointer dereferenziert? Ich habe bisher immer nur die Funktion dahinter ausgeführt
)Korrekt wär IMHO return fcn(cout);
Ach und fcn hat an der Stelle wenig mit der STL zu tun, innerhalb Deiner eigenen Funktion kannst du "fcn" auch "klausdieter" nennen

-
LordJaxom schrieb:
Und das geht durch den Compiler?
(Was kommt eigentlich raus wenn man einen Funktionspointer dereferenziert? Ich habe bisher immer nur die Funktion dahinter ausgeführt
)Korrekt wär IMHO return fcn(cout);
Ach und fcn hat an der Stelle wenig mit der STL zu tun, innerhalb Deiner eigenen Funktion kannst du "fcn" auch "klausdieter" nennen

Hmpf. Nun hat es klick gemacht. Ich konnte mit der Funktionssignatur nicht ganz so viel anfangen, da ich es immer anders gemacht habe. Um solche Konstrukte übersichtlich zu halten nutze ich meist typedef.
typedef void (__cdecl * fptr ) (void); void test(fptr);Nun ist es eigentlich klar. Und es muss fcn(cout) heißen.

Spitze. Vielen Dank an Euch.