c++ Compiler meckert 'multiple definition of `AlgoKS::operator+..."

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

c++ Compiler meckert 'multiple definition of `AlgoKS::operator+…"
Ich bekam eine Mail mit folgendem Problem:

Das Problem ist, dass der g++ die Dateien ‚main.cpp‘ und ‚Complex.cpp‘ unabhängig von einander compiliert.
d.h. beim Compilieren von ‚main.cpp‘ erstellt er Maschinencode für die Funktion ‚operator+‘
aber auch beim Compilieren von ‚complex.cpp‘ erstellt er Maschinencode für dieselbe Funktion.
Will er nun die beiden .o files (main.o und compex.o) zu einem executable zusammenfügen (also linken)
stellt er fest, dass er zweimal Maschinencode für die Funktion hat und meckert.

Es gibt nun zwei mögliche Lösungen für dieses Problem:

  • Entweder man hällt sich strikt an die Trennung von Deklaration und Implementierung in Header und .cpp file, d.h. man verschiebt die Implementierung in die Datei complex.cpp und lässt nur eine Deklaration im Header
  • Oder man ‚inlined‘ die Funktion im Header. Damit wird kein Maschinencode für die Funktion erstellt sondern die Funktion wird immer direkt an der Stelle in den Code (Und somit auch in den Maschinencode) eingefügt, wo der operator+ benötigt wird.

Also, schreib deinen operator+ (und auch operator<<) am besten wie folgt:

    inline Complex operator+(Complex& a, Complex& b) {
    	Complex ret(a.getReal() + b.getReal(), a.getImag() + b.getImag());
		return ret;
    }

Gruss, Jochen