Opterator << in abstrakten Klassen überladen
-
Hallo,
ich habe eine abstrakte Template Klasse und bekomme immer einen Fehler den ich leider ganz und gar nicht verstehe.
Meine Klasse sieht vereinfacht so aus:
template<char Character, int Count = 3> class my_class { public: my_class(); virtual ~my_class(); protected: //Operators, all are abstarct virtual std::ostream& operator<<(std::ostream& lhs, my_class const& rhs) = 0; private: };Ich habe mich nach Punkt 3.4 gerichtet. http://www.c-plusplus.net/forum/viewtopic-var-t-is-232010.html
Und nun gibt es immer folgende schöne Fehlermeldung:
Description Resource Path Location Type
'std::ostream& my_class<Character, Count>::operator<<(std::ostream&, const my_class<Character, Count>&)' must take exactly one argument my_class.h /my_class line 16 C/C++ ProblemKönnt ihr mir weiter helfen? Stehe momentan auf dem Schlauch.
Viele Grüße
MM
-
Als Funktion in einer Klasse nimmt der <<Operator als Argument nur die rechts stehende Klasse. In deinem Fall musst du die Funktion außerhalb der Klasse definieren.
-
Caster schrieb:
..
Was castest du eigentlich?
-
MrMilk schrieb:
Ich habe mich nach Punkt 3.4 gerichtet. http://www.c-plusplus.net/forum/viewtopic-var-t-is-232010.html
Hast du leider nicht. Operator<< muss als freie Funktion überladen werden. Du kannst aber eine virtuelle Klassenfunktion benutzen, die die eigentliche Arbeit verrichtet und den op<< einfach diese aufrufen lassen:
template<char Character, int Count = 3> class my_class { public: virtual std::ostream& printToStream(std::ostream& os) const = 0; }; template<char Character, int Count> std::ostream& operator<<(std::ostream& os, my_class<Character, Count> const& mc) { return mc.printToStream(os); }Dann nurnoch printToStream überladen lassen.
-
Wie immer vielen Dank an alle und natürlich besonderen Dank an pumuckl!
Es klappt.Viele grüße
MM