[Linker Fehler] Unresolved external
-
Hallo,
ich habe eine existierende Klasse in eine Template-Klasse gewandelt.template <typename type_T> class COORDINATES { private: public: //------------------------------------------------------------------------- // variables type_T x, y, z; //------------------------------------------------------------------------- // operators COORDINATES operator + (const COORDINATES& op2) const; COORDINATES operator - (const COORDINATES& op2) const; void operator = (const COORDINATES& op2); type_T operator * (const COORDINATES& op2) const; //------------------------------------------------------------------------- // constructors COORDINATES(); COORDINATES(type_T, type_T); COORDINATES(type_T, type_T, type_T); //------------------------------------------------------------------------- // methods void Set(type_T, type_T); void Set(type_T, type_T, type_T); void SetZero(void); double L2norm(void); void MultiplyBy(type_T d); void DivideBy(type_T d); };
Die Klasse ist in zwei Dateien COORDINATES.cpp und COORDINATES.h definiert und dem Projekt hinzugefügt worden.
Mit der ürsprunglichen Klassedefinition hatte ich keine Probleme aber seit der Umstellung bekomme ich vom Linker folgende Fehlermeldung:
[Linker Fehler] Unresolved external 'COORDINATES<double>::Set(double, double, double)' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\COORD\UNIT1.OBJ
Ich habe schon das Forum durchsucht und die Tips mit BCB schließen,
temporäre Dateien löschen und BCB wieder starten haben nicht zum Erfolg geführt.MfG
mul2bk.
-
Der Compiler benötigt die vollständige Klassendefinition mit allen Methodendefinitionen, wenn er daraus einen neuen Typen kompilieren soll. Du wirst also alles in den Header packen müssen oder die cpp-Datei inkludieren müssen.
-
Ich habe die Methodendefinitionen mit ins Headerfile gepackt.
Jetzt funktioniert es.Danke für den Tip.
-
häufig ist es schöner die .h und die .cpp zu trennen. Falls Du das machen möchtest, dann einfach am Ende der .h #include xxx.cpp schreiben und die xxx.cpp in der Option Projekt -> Aus dem Projekt entfernen ... wieder rausnehmen. Dann sollte es auch gehen.
witte hat das zwar auch schon erwähnt, aber ich denke so ist es etwas deutlicher.Gruß
Markus
-
Markus,
habe Deinen Vorschlag auch ausprobiert:#ifndef ClassCOORDINATES_H #define ClassCOORDINATES_H //----------------------------------------------------------------------------- #include <math> template <typename type_T> class COORDINATES { private: public: //------------------------------------------------------------------------- // variables type_T x, y, z; //------------------------------------------------------------------------- // operators COORDINATES operator + (const COORDINATES& op2) const; COORDINATES operator - (const COORDINATES& op2) const; void operator = (const COORDINATES& op2); type_T operator * (const COORDINATES& op2) const; //------------------------------------------------------------------------- // constructors COORDINATES(); COORDINATES(type_T, type_T); COORDINATES(type_T, type_T, type_T); //------------------------------------------------------------------------- // methods void Set(type_T, type_T); void Set(type_T, type_T, type_T); void SetZero(void); double L2norm(void); void MultiplyBy(type_T d); void DivideBy(type_T d); COORDINATES TurnBy(double degree); }; #include "ClassCOORDINATES.cpp" #endif
funktioniert aber nur, wenn das include vor dem #endif steht.
Gruß
mul2bk
-
Hallo mul2bk,
naja, das habe ich eigentlich stillschweigend vorausgesetzt. Außerhalb des Header-Wächters wäre aus auch wenig sinnvoll.
Weiterhin viel Erfolg!