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++ Problem

    Kö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


Anmelden zum Antworten