C++ - muss Freund-Funktionen werden definiert in der header Datei?
Ich will überladen Sie den operator << in einer meiner Klassen.
Die Signatur geht so:
friend std::ostream& operator<<(std::ostream& os, const Annuaire& obj)
Wenn ich versuche es zu definieren im .cpp-Datei, die es sagt, dass der operator<< genau 1 argument, aber wenn ich es definieren .h, es kompiliert/funktioniert einwandfrei.
Dies ist, wie ich es definieren .cpp-Datei :
std::ostream& Annuaire::operator<<(std::ostream& os, const Annuaire& obj){ //... }
Muss es etwas zu tun mit friend-Funktionen müssen definiert werden in header-Dateien?
Sie haben, um
ja, Ihr Freund ist istream und der in der cpp wird ostream, wenn das beabsichtigt ist, benötigen Sie 2 friend-Deklarationen und 2 Definitionen, wenn nicht, beheben eine oder das andere, je nachdem, ob Sie wollen oder raus-stream
Danke, das war ein copy-paste Fehler sowieso.
ostream
und istream
Recht...ja, Ihr Freund ist istream und der in der cpp wird ostream, wenn das beabsichtigt ist, benötigen Sie 2 friend-Deklarationen und 2 Definitionen, wenn nicht, beheben eine oder das andere, je nachdem, ob Sie wollen oder raus-stream
Danke, das war ein copy-paste Fehler sowieso.
InformationsquelleAutor Pacane | 2011-12-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann es sein definiert in einer cpp-Datei, aber es braucht zumindest erklärt in eine header-Datei, ansonsten alle Orte, wo Sie wollen, es zu benutzen, sehen nur das, was der stream selbst gibt Sie, und nicht Ihre überlastung.
InformationsquelleAutor Xeo
Das problem ist mit der Art, wie Sie sind, es zu definieren. Es ist nicht eine Mitglied der Klasse, es ist nur ein Freund der Klasse. Sie brauchen, um die drop
Annuaire::
Präfix. So ändern Sie diese::
Den Grund für die Fehlermeldung ist, dass
Annuaire::operator<<(std::ostream& os, const Annuaire& obj)
erwarten würden drei Argumente: dieAnnuaire
Instanz, von der es heißt (wiethis
), und zwei weitere Argumente (os
undobj
).InformationsquelleAutor ruakh
Wie bereits im David ' s Antwort, in diesem Fall der operator ist nicht member-Funktion, es ist lediglich eine Freund-Funktion in der gleichen namespace. Dieser wies mich in die richtige Richtung bei der Lösung eines sehr ähnlichen Problem.
Ich bin dieses posting Antworten, weil es war nicht sofort klar für mich. Vielleicht, weil der Implementierungsdatei, wo ich das hinzufügen der Betreiber war nicht vollständig eingeschlossen in den namespace und verwendet eine using-Direktive statt.
Sollte nicht relevant sein, aber ich bin mit VS2013.
InformationsquelleAutor Jorge Paulo
Friend-Funktionen, auch wenn Sie scheinen deklariert werden innerhalb der Klasse sind nicht die Funktionen sondern eher namespace-level-Funktionen (in den umschließenden namespace). In Ihrem code deklarieren Sie die friend-Funktion richtig, aber Sie versuchen, es zu definieren, wie eine member-Funktion der Klasse:
Diese definition wäre für eine member-Funktion von
Annuaire
genanntoperator<<
, das zwei Argumente nimmt, die ungültig ist, wieoperator<<
überlastet werden kann in eine von zwei Arten: als eine freie Funktion, die zwei Argumente (Links und rechts) oder als member-Funktion der Klasse wird in der lhs der Ausdruck unter einem argument vom RS-Typ. In diesem speziellen Fall, da die lhs iststd::ostream
und Sie es nicht ändern können, bleibt nur die Möglichkeit, eine Kostenlose Funktion:using namespace X
vor der eigentlichen Funktionsdefinition ist nicht genug.InformationsquelleAutor David Rodríguez - dribeas
Keine solche Einschränkung; Sie sind wahrscheinlich einfach nur zu schreiben es falsch. Sollte so etwas wie dieses:
InformationsquelleAutor Kerrek SB