2017-10-02 4 views
-2

Class.hFehler: keine Übereinstimmung für 'Operator <<' (noch Operator << wird innerhalb der Klasse definiert)

std::ostream& operator<<(std::ostream &strm); 

Class.cpp

std::ostream& operator<<(std::ostream &strm, Classname &a) { 
    return strm << a.getAge(); 
} 

main()

Classname one(5) //this sets the age to 5; 
std::cout << one; 

Also das ist der Code, den ich habe. Ich habe diesen Fehler gegoogelt und die Lösung war immer, den std :: ostream & Operator < < zu implementieren, aber ich habe das getan und es funktioniert nicht.

Ich verstehe auch nicht, warum ich nicht haben kann (Classname) innerhalb der Classname.h Implementierung (es gibt mir eine Fehlermeldung, dass es nur ein Argument geben kann), noch auf Classname.cpp müssen zwei sein Ansonsten gibt es einen Fehler.

+2

Sie haben nicht genug Code hier, um herauszufinden, was das Problem ist. Du brauchst ein [mcve]. Wir könnten raten, was passiert, aber das ist nur Vermutung – Justin

+3

Schauen Sie sich Ihre ersten zwei Codeblöcke an. Haben die Funktionen die gleiche Signatur? – NathanOliver

+0

@Justin Eine MVCE wäre besser, aber ich denke, wir haben genug, um in diesem Fall zu antworten. Sieh Nathans Kommentar. – Borgleader

Antwort

1

Ich nehme an, die std::ostream& operator<<(std::ostream &strm); ist irgendwo innerhalb der class Classname Körper.

Dies ist nicht korrekt; das würde Sie schreiben lassen

one << cout; 

was ist nicht was Sie wollen. Sie müssen sie erklären, wie Sie es in Class.cpp, außerhalb des Körpers von Classname aber im gleichen Namensraum definieren, um sie in der richtigen Reihenfolge zu machen arbeiten:

std::ostream& operator<<(std::ostream &strm, Classname &a); 

(obwohl es besser wäre, beide zu machen von ihnen verwenden Classname const& a anstelle von nicht const Verweis).

Wenn Classname::getAgeprivate oder protected ist, dann wäre es besser, nur die öffentliche API von Classname zu verwenden. Wenn Sie das nicht können, muss der Operator eine friend sein. es im Classname Körper wie folgt:

friend std::ostream& operator<<(std::ostream &strm, Classname &a); 

Beachten Sie, dass in all diesen Fällen die Parameter an die Funktion die Reihenfolge, die Reihenfolge der Klassen für den Bediener übereinstimmt.

Verwandte Themen