Linker-Error bei templates



  • Hey:
    Folgender Code:

    template <class T1>
    class GraphicObject {
        private:
            Vektor<T1> directionVektor;
            Vektor<T1> positionVektor;
            Vektor<T1> speedVektor;
    
        public:
    
            const Vektor<T1>& GetSpeedVektor() const;
            const Vektor<T1>& GetPositionVektor() const;
            const Vektor<T1>& GetDirectionVektor() const;
    //usw...
    };
    
    template <class T1>
    
    class Vektor {
    
        private:
            T1 x; T1 y; T1 z;
        public:
            Vektor<T1> normal() const;
            T1 GetLen() const;
            T1 GetX() const;
            T1 GetY() const;
            T1 GetZ() const;
            //usw...
    };
    

    Beim ersten Aufruf (im Qulltext, also nicht im Programmablauf) von GraphicObject.GetPositionVektor() bekomme ich den Linkerfeheler: :|undefined reference to `GraphicObject<double>::GetPositionVektor() const'

    Hört sich für mich so an, als würde der Linker keine passende Funktion finden falls der Vektor vom Typ "double" ist, nur ist der Datentyp ja komplett Frei wählbar.



  • Bei Templates müssen auch die Funktionen im Header definiert werden.



  • Habe ich teilweise schon über google-Recherchen so gehört, jedoch verlang die Aufgabenstellung definitif eine Trennung von Klassendeklaration in die Headerdatei und Klassendefinition in die cpp-datei.

    Wortlaut: "Teilen Sie die Klasse auf eine headerdatei complex.hpp und eine Implementierungsdatei complex.cpp auf."

    Gibts da doch noch irgendne Möglichkeit??



  • meisteralex schrieb:

    Gibts da doch noch irgendne Möglichkeit??

    Mit Templates geht das nur über export , ein Schlüsselwort, das von sehr wenigen Compiler unterstützt wird und auch sonst mehr verspricht, als es hält.

    Es ist also üblich, Templates vollständig in Headern zu definieren. Was man tun kann, um die Trennung von Schnittstelle und Implementierung aufrecht zu erhalten, ist eine separate Headerdatei mit den Funktionsdefinitionen am Ende des Schnittstellen-Headers einzufügen.

    Aber mal abgesehen davon: Was hat das mit diesem Thread zu tun? Der ist fast ein Monat alt. Überhaupt, wie kommst du auf komplexe Zahlen?



  • sorry, hatte 2 fenster auf und hab auf den falschen thread geantwortet 😞



  • meisteralex schrieb:

    sorry, hatte 2 fenster auf und hab auf den falschen thread geantwortet 😞

    :p
    Habs noch gedacht, warum jetzt hier praktisch das gleiche besprochen wird, wie im anderen Thread.. 🙂


Anmelden zum Antworten