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 nichttypname
.Ausserdem musst du bei der Klasse auch noch den Typen angeben:
Vektor<T>::Vektor(...
-
ahh ja gut danke! nun gehts