LNK2019, weiß nicht wo der fehler sein soll
-
Hallo,
ich bekomme beim Linker folgende Fehlermeldungstring.obj : error LNK2019: unresolved external symbol "public: char const & __thiscall carray<char>::operator[](int)const " (??A?$carray@D@@QBEABDH@Z) referenced in function "public: int __thiscall cstring::index_of_any(class carray<char> const &,int,int)const " (?index_of_any@cstring@@QBEHABV?$carray@D@@HH@Z)folgender Code dazu
//array.h template<class t> class carray { //... t &operator [] (int index); t const &operator [] (int index) const; //... }; //string.h class cstring : virtual public carray { //... int index_of_any(carray<char> const &src, int start_index, int length) const; //... }; //string.cpp int cstring::index_of_any(carray<char> const &src, int start_index, int length) const { int index; for(int i = 0; i <= src.get_upper_bound(); i++) { index = index_of(src[i], start_index, length);//hier wird const-[] gebraucht if(in_range(index)) return index; }; return -1; };ich hab leider keinen Ansatz wo das Problem liegt, daher bin ich für jede Hilfe dankbar.
GrüßePS: bitte keine Lösungsvorschläge, dass ich irgendwas Vorgefertigtes von Standardbibliotheken nutzen soll, ich möchte einfach nur wissen wo das Problem / der Fehler ist und wie ich das richtig machen muss. Danke.
-
wo ist die implementierung von carray<char>::operator[]?
es gibt übrigens std::string. muss gesagt werden, auch wenn du es nicht hören willst.
-
Da hättest du aber auch schon Compile Fehler bekommen müssen.
Allerdings weisen diese Fehler darauf hin, dass er irgendein Objekt nicht finden kann. -> Wie sieht hier die physische Struktur der Dateien aus? Alles richtig includet? Header Guards usw.?
-
oh hab ich vergessen mit hinzuschreiben, sorry
//array.cpp template<class t> t &carray<t>::operator [] (int index) { try { if(!in_range(index)) throw array_exception(0); if(!_data[index]) throw object_exception(0); return *(_data[index]); } catch (cexception e) { std::cout << e; exit(1); }; }; template<class t> t const &carray<t>::operator [] (int index) const { //s.o., ist genau das gleiche, der Unterschied liegt nur in dem const };die exceptions sind von mir selbst definierte exception-klassen, aber die lasse ich jetzt mal weg, da die nicht relevant sein dürften.
-
Die Definition der Operatoren ist im Header array.h?
-
hah ja ich weiss das ist ziemlich strange, hatte auch so nen ähnlichen linker error in der art
ich hab dann einfach die definition in die .h file gehaut und auf ein mal hat er sie gefunden... ka was c++ da aufführt, hatte jedenfalls keine lust mich damit rumzuschlagen wieso er ein unresolved symbol hat wenn die funktionsdefinition in der cpp file drin ist -.-
-
was hätte ich denn für compiler-fehler bekommen müssen?
include-guards sind vorhandenphysische struktur:
> Ordner > Array > array.h, array.cpp > String > string.h, string.cpp//string.h //... #include "../Array/array.h" //...
-
LordJaxom schrieb:
Die Definition der Operatoren ist im Header array.h?
Die Definitionen der Funktionen müssen in den Header array.h!
-
nur die deklaration der operatoren ist im header, die definition ist in der cpp
-
wieso muss die definition in den header rein?
-
die definition muss aber auch in den Header, wegen den Templates.
Zur Vollständigkeit: Es gibt noch das export-Schlüsselwort, dass allerdings fast kein Compiler unterstützt
-
ok, hab die array.cpp am ende der array.h includet, jetzt funktioniert es
-
Begründung:
Templates erzeugen keine Symbole, ergo kann der Linker auch keine finden können. Erst Funktionen und Klassen erzeugen Symbole, und die entstehen erst, wenn das Template instanziert wird. Wenn das Template instanziert wird, muss der Compiler natürlich dessen komplette Definition kennen.
-
jetzt hab ich in nem anderen projekt aber noch ein anderes problem:
string.obj : error LNK2001: unresolved external symbol "public: __thiscall cobject::~cobject(void)" (??1cobject@@QAE@XZ)cobject ist dabei eine basisklasse aller meiner selbstdefinierten klassen.
-
das eigenartige ist hier, wenn ich die definitionen von cobject aus der cpp file in die header file reinnehme und als inline definiere dann kommt der fehler nicht mehr. kann mir das jemand erklären?
-
meine erklärung dafür ist dass generics in c++ scheiße gelöst sind *g*
-
Vevusio schrieb:
meine erklärung dafür ist dass generics in c++ scheiße gelöst sind *g*
1. Templates != Generics
2. Irrelevant, da cObject vermutlich kein template ist
3. Alternativvorschläge?
-
weder cobject noch cstring sind templates.
cobject macht eigentlich nichts anderes als über einen static member zu zählen wieviel objekte es gibt, die von cobject abgeleitet sind.
ich hab wie gesagt die definitionen von cobject als inline funktionen in die header mit reingenommen und es funktioniert, allerdings hab ich keinen blassen schimmer woran das liegt. würde mich sehr interessieren was der grund dafür ist.