undefined reference trotz definition
-
hi, sry, eigentlich dachte ich, den Fehler finde ich selbst, aber ich versteh einfach nicht, was daran falsch sein soll:
main:
IP ip(1,1,1,1); IP ip2(1,1,1,1); if(ip == ip2) {cout<<"KK"<<endl; }IP.h
namespace Rnet { ... class IP { private: ... public: ... bool operator==(const IP& _ip) const;Und in der IP.cpp:
inline Rnet::IP::IP(unsigned short _a,unsigned short _b,unsigned short _c, unsigned short _d) {Ist da ein Fehler drin? Danke Leute, bin echt schon am verzweifeln ^^
-
ist der namespace in main geöffnet ?
Sonst müsste es RNet::IP heissen.
-
nee, ja ist geöffnet. hier nochmal der genaue Fehler:
undefined reference to `Rnet::IP::operator==(Rnet::IP const&) const'
-
inline-Funktionen in Cpp-Files zu versenken ist ein bißchen ungünstig....
Ansonsten, wo ist deine Operator-Funktion in der Cpp-Datei?
-
Mathias schrieb:
inline-Funktionen in Cpp-Files zu versenken ist ein bißchen ungünstig....

-
MaxDemian schrieb:
nee, ja ist geöffnet. hier nochmal der genaue Fehler:
undefined reference to `Rnet::IP::operator==(Rnet::IP const&) const'
Der Compiler sagt's doch recht deutlich, er kann die Implementierung Deines op== nicht finden.
-
inline besagt, dass der Compiler den Funktionsaufruf wenn er lust dazu hat durch den Source-Code der Funktion ersetzen darf.
Steht die Funktion innerhalb einer Cpp-Datei kann der Compiler dies jedoch nur in der Cpp-Datei selbst, da ihm der Source-Code beim Übersetzen von anderen Cpp-Datien gar nicht bekannt ist (werden schließlich nur die Header-Dateien inkludiert). Die Anweisung inline macht daher im Allgemeinen nur bei Funktionen einen Sinn, deren Implementierung sich in der Header-Datei befinden.

-
Mathias schrieb:
inline besagt, dass der Compiler den Funktionsaufruf wenn er lust dazu hat durch den Source-Code der Funktion ersetzen darf.
Nein, das tut es nicht. In C++ gilt die ODR (one definition rule), es darf zu jeder Entität nur genau eine Definition geben. inline ändert diese Regel so ab, daß die Definition beliebig oft vorhanden sein darf, solange sie Token für Token identisch ist.
Steht die Funktion innerhalb einer Cpp-Datei kann der Compiler dies jedoch nur in der Cpp-Datei selbst, da ihm der Source-Code beim Übersetzen von anderen Cpp-Datien gar nicht bekannt ist (werden schließlich nur die Header-Dateien inkludiert). Die Anweisung inline macht daher im Allgemeinen nur bei Funktionen einen Sinn, deren Implementierung sich in der Header-Datei befinden.

Der letzte Satz stimmt. Allerdings können inzwischen einige Compiler auch über die Übersetzungseinheiten hinweg optimieren (VC zum Beispiel), der kann dann trotzdem noch inlinen. Dabei ist er jedoch von dem "inline" völlig unabhängig, da es wie gesagt in C++ eine etwas andere Bedeutung hat, als so mancher erwartet.
MfG Jester
-
ja, es hat daran gelegen das die inline definition nit in der header-datei war... Da ist der Compiler aber pingelig ^^
-
Ups stimmt. inline sagt: Definition darf beliebig oft auftauchen, aber in jeder ÜE mind. einmal.
-
An die Aufhebung der ODR hab ich gar nicht gedacht, bin vielleicht doch schon etwas programmiergeschädigt.

Ist an der Stelle allerdings die logische Konsequenz, da die Implementierung einer Inline-Funktion im Header steht, wodurch die ODR durch mehrfaches inkludieren einer Header-Datei verletzt wird...Das ist allerdings meiner Meinung nach nicht die Funktionalität von inline, sondern eine Notwendigkeit um die Funktionalität von inline umsetzen zu können.
