Überladener operator<< wird nicht aufgerufen



  • Ich weiß nicht, ob ich einfach irgendwas übersehen habe, aber aus irgendeinem Grund findet der Compiler die Überladung des op<< nicht.
    Es geht dabei um folgende Codeabschnitte:

    binarytree.h:
    
    template<class T>
    class Node
    {
        public:
            [...]
            T data;
            [...]
            friend std::ostream& operator<<(std::ostream&, const Node<U>&);
            [...]
    };
    
    template <class U>
    std::ostream& operator<<(std::ostream& os, const Node<U>& r)
    {
        os << r.data;
        return os;
    }
    
    main.cpp:
    
    int main()
    {
        Node<int>* head = new Node<int>;
        head->setData(5);
    
        cout << head; //ein vordefiniert op<< wird aufgerufen
                      //-> gibt die Addresse von dem Objekt aus
    
        operator<<(cout, head); //erzeugt Compilerfehler, dass der Aufruf nicht eindeutig ist
                                //Kandidaten sind aber nur für Basistypen (int, char)
    
        cout << head->data; //funktioniert
    
        delete head;
        return 0;
    }
    

    Kann mir da wer weiterhelfen?

    Edit: Na toll, ich denke da ewig drüber nach und dann fällt mir die Anwort ein, wenn ich den Beitrag grad absende :o

    Ich übergebe dem op<< einen Pointer und das kann natürlich nicht implizit in eine Referenz umgewandelt werden. *Kopf gegen Tischkante hau*



  • cout << *head;
    

    "head" ist keine Node, sondern nur ein Zeiger auf eine Node.



  • Danke für die schnelle Antwort, da war ich sogar mit meinem Edit langsamer :>



  • Du hast einen op<< für Referenzen, aber nicht für Zeiger auf 'Node', also mußt du darüber auch Referenzen (bzw. Objekte) ausgeben:

    Node<int>* head = new Node<int>;
    head->setData(5);
    
    cout << *head;//Dereferenzieren -> Zugriff auf das Objekt "hinter" deinem Zeiger
    

    Edit: zu langsam 😕 was ist nur mit mir los?


Anmelden zum Antworten