Templates error: "used without template parameters"



  • Hey!

    Hab gerade angefangen ein paar alte Klassen von mir mit Templates zu erweitern, nur dummerweise will das nicht so wie ich 😉

    /* Vektor.h */
    template <class T>
    
    class Vektor {
    
        private:
            T x; T y; T z;
    
        public:
            Vektor(T pX = 0, T pY = 0, T pZ = 0);
            Vektor(T pAll = 0);
            Vektor(const Vektor &pVektor);
    //usw.
    
    /* Vektor.cpp */
    #include "Vektor.h"
    
    Vektor::Vektor(T pX = 0, T pY = 0, T pZ = 0) {
        x = pX;
        y = pY;
        z = pZ;
    }
    
    Vektor::Vektor(T pAll = 0) {
        x = pAll;
        y = pAll;
        z = pAll;
    }
    
    Vektor::Vektor(const Vektor &pVektor) {
        x = pVektor.GetX();
        y = pVektor.GetY();
        z = pVektor.GetZ();
    }
    //usw..
    

    Error:`template<class T> class Vektor' used without template parameters im Kopf vom Konstruktor.

    P.S. Gibt es eine Möglichkeit die Typen für templates einzuschränken? Also ein Vektor aus char macht ja wenig Sinn...



  • Hallo

    Pille456 schrieb:

    /* Vektor.h */
    template <class T>
    
    class Vektor {
    
        private:
            T x; T y; T z;
    
        public:
            Vektor(T pX = 0, T pY = 0, T pZ = 0);
            Vektor(T pAll = 0);
            Vektor(const Vektor &pVektor);
    //usw.
    //immer noch im Header:
    
    template<typename T>
    Vektor::Vektor(T pX = 0, T pY = 0, T pZ = 0) {
        x = pX;
        y = pY;
        z = pZ;
    }
    
    template<typename T>
    Vektor::Vektor(T pAll = 0) {
        x = pAll;
        y = pAll;
        z = pAll;
    }
    
    template<typename T>
    Vektor::Vektor(const Vektor &pVektor) {
        x = pVektor.GetX();
        y = pVektor.GetY();
        z = pVektor.GetZ();
    }
    //usw..
    

    Error:`template<class T> class Vektor' used without template parameters im Kopf vom Konstruktor.

    Fixed. Du musst Templates inline implementieren, das auslagern des Codes in eine *.cpp Datei wird nicht unterstützt. Desweiteren darfst du natürlich nicht vergessen anzugeben, dass es sich um Templates handelt bei der Implementierung.

    Pille456 schrieb:

    P.S. Gibt es eine Möglichkeit die Typen für templates einzuschränken? Also ein Vektor aus char macht ja wenig Sinn...

    Mit dem aktuellen C++-Standard kannst du das noch nicht 😉



  • 1. bei template klassen MUSS die definiton im header stattfinden
    2. bei der definition muss die komplette deklaration enthalten sein
    3. du hast "quasi" 2 Standardkonstruktoren, da du bei beiden alle Argumente mit Default-Werten belegst. Der Kompiler wirft dementsprechend eine Fehlermeldung, wenn du z.B. Vector<int> test(); verwendest, da er nicht weiß welchen ctor er verwenden soll!

    also

    // Vektor.h 
    template <typename T>
    
    class Vektor {
    
        private:
            T x; T y; T z;
    
        public:
            Vektor(T pX = 0, T pY = 0, T pZ = 0);
            Vektor(T pAll);
            Vektor(const Vektor &pVektor);
    };
    
    template <typename T>
    Vektor<T>::Vektor(T pX = 0, T pY = 0, T pZ = 0) {
        x = pX;
        y = pY;
        z = pZ;
    }
    template <typename T>
    Vektor<T>::Vektor(T pAll = 0) {
        x = pAll;
        y = pAll;
        z = pAll;
    }
    
    template <typename T>
    Vektor<T>::Vektor(const Vektor &pVektor) {
        x = pVektor.GetX();
        y = pVektor.GetY();
        z = pVektor.GetZ();
    }
    //usw..
    

    PS: ich würde die Klasse aber 3DVector oder Vector3D oder Vector3 nennen...

    @/rant/: deine Lösung funktioniert so nicht, da die Klasse vollstaendig

    template <class T> Vektor<T>
    

    heisst.
    Entweder er definiert bereits beim Deklarieren der ctors die Funktionalität, dann entfaellt das <T>, oder er definiert extern, dann muss er aber auch obiges verwenden!

    edit: class -> typename



  • Hmm. Folgendes funktioniert (nicht):

    //funktioniert:
    template <class T>
    
    class Vektor {
    
        private:
            T x; T y; T z;
    
        public:
            Vektor(T pX = 0, T pY = 0, T pZ = 0);
            Vektor(T pAll = 0);
            Vektor(const Vektor &pVektor);
    
            Vektor::Vektor(T pX = 0, T pY = 0, T pZ = 0) {
        x = pX;
        y = pY;
        z = pZ;
    }
    };
    
    //funktioniert nicht:
    template <class T>
    
    class Vektor {
    
        private:
            T x; T y; T z;
    
        public:
            Vektor(T pX = 0, T pY = 0, T pZ = 0);
            Vektor(T pAll = 0);
            Vektor(const Vektor &pVektor);
    };
    template <typname T> //egal ob mit oder ohne, selber Fehler
      Vektor::Vektor(T pX = 0, T pY = 0, T pZ = 0) {
        x = pX;
        y = pY;
        z = pZ;
    }
    


  • /rant/ schrieb:

    Pille456 schrieb:

    P.S. Gibt es eine Möglichkeit die Typen für templates einzuschränken? Also ein Vektor aus char macht ja wenig Sinn...

    Mit dem aktuellen C++-Standard kannst du das noch nicht 😉

    Es gibt da schon einige Workarounds, z.B. boost::enable_if . Das kannst du dir bei Gelegenheit ja mal anschauen... 😉

    Pille456 schrieb:

    template <typname T> //egal ob mit oder ohne, selber Fehler
    

    Das Schlüsselwort heisst auch typename und nicht typname .

    Ausserdem musst du bei der Klasse auch noch den Typen angeben:

    Vektor<T>::Vektor(...
    


  • ahh ja gut danke! nun gehts


Anmelden zum Antworten