[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! 👍


Anmelden zum Antworten