Ich weiß, dass es möglich ist, eine Vorlagenfunktion zu erstellen:
template<typename T>
void DoSomeThing(T x){}
und es ist möglich, eine Vorlagenklasse zu erstellen:
template<typename T>
class Object
{
public:
int x;
};
aber ist es möglich, eine Klasse nicht innerhalb einer Vorlage zu erstellen und dann eine Funktion in dieser Klasse zu einer Vorlage zu machen? Dh:
//I have no idea if this is right, this is just how I think it would look
class Object
{
public:
template<class T>
void DoX(){}
};
oder etwas in dem Maße, wo die Klasse nicht Teil einer Vorlage ist, sondern die Funktion?
Ihre Vermutung ist die Richtige. Das einzige, was Sie beachten müssen, ist, dass die Memberfunktionsvorlage definition (zusätzlich zur Deklaration) in der Headerdatei enthalten sein muss, nicht in der cpp -Datei, obwohl es nicht im Body sein muss der Klassendeklaration selbst.
Siehe hier: Vorlagen , Vorlagenmethoden , Mitgliedervorlagen, Mitgliederfunktionsvorlagen
class Vector
{
int array[3];
template <class TVECTOR2>
void eqAdd(TVECTOR2 v2);
};
template <class TVECTOR2>
void Vector::eqAdd(TVECTOR2 a2)
{
for (int i(0); i < 3; ++i) array[i] += a2[i];
}
Ja, Template-Member-Funktionen sind bei vielen Gelegenheiten absolut legal und nützlich.
Der einzige Nachteil ist, dass Vorlagenelementfunktionen nicht virtuell sein können.
Der einfachste Weg ist, die Deklaration und Definition in dieselbe Datei zu packen. Dies kann jedoch zu einer übergroßen Datei führen. Z.B.
class Foo
{
public:
template <typename T> void some_method(T t) {//...}
}
Es ist auch möglich, die Schablonendefinition in die separaten Dateien einzufügen, d. Sie müssen lediglich die Template-Instantiierung explizit in die CPP-Dateien einschließen. Z.B.
// .h file
class Foo
{
public:
template <typename T> void some_method(T t);
}
// .cpp file
//...
template <typename T> void Foo::some_method(T t)
{//...}
//...
template void Foo::some_method<int>(int);
template void Foo::some_method<double>(double);