Heim  >  Artikel  >  Backend-Entwicklung  >  Warum führt das Überladen von Operatoren in einer Header-Datei zu mehreren Definitionsfehlern?

Warum führt das Überladen von Operatoren in einer Header-Datei zu mehreren Definitionsfehlern?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-19 05:06:02755Durchsuche

Why Does Operator Overloading in a Header File Lead to Multiple Definition Errors?

Mehrfache Definition der Operatorüberladung in der Header-Datei

Im bereitgestellten Codebeispiel stößt der Compiler auf einen Mehrfachdefinitionsfehler für den Operator<< ; Überladung für die Complex-Klasse. Trotz des Schutzes der Header-Datei durch Präprozessor-Schutzvorrichtungen tritt dieser Fehler aufgrund der Definition des Operators << auf. Funktion, die im Header platziert wird.

Konkret handelt es sich bei der Zeile std::ostream& Operator<<(std::ostream& o, const Complex& Cplx) in der Header-Datei nicht um eine Deklaration, sondern eher um eine Definition. Wenn sowohl complex.cpp als auch main.cpp die Header-Datei enthalten, erkennt der Compiler daher doppelte Definitionen des Operators << Funktion während der Verknüpfung.

Im Gegensatz zur real()-Memberfunktion, die implizit inline ist und daher nicht anfällig für mehrere Definitionsfehler ist, ist der Operator<< Überladung ist explizit in der Header-Datei definiert. Daher muss es explizit mit dem Schlüsselwort inline als inline markiert werden, um mehrere Definitionen zu ermöglichen.

inline std::ostream& operator<<(std::ostream& o, const Complex& Cplx) {
    return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}

Alternativ kann die Definition des Operators<< Überladung kann in die Quelldatei complex.cpp verschoben werden, um den Fehler bei mehreren Definitionen zu verhindern. Durch die Trennung von Deklaration und Definition kann der Compiler den Verweis auf den Operator << korrekt verarbeiten. Funktion in main.cpp, ohne auf mehrere Definitionen zu stoßen.

Das obige ist der detaillierte Inhalt vonWarum führt das Überladen von Operatoren in einer Header-Datei zu mehreren Definitionsfehlern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn