it-swarm.com.de

Wie erstelle ich eine Vorlagenfunktion innerhalb einer Klasse? (C++)

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?

127
user98188

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.

101
Not Sure

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];
}
62
none

Ja, Template-Member-Funktionen sind bei vielen Gelegenheiten absolut legal und nützlich.

Der einzige Nachteil ist, dass Vorlagenelementfunktionen nicht virtuell sein können.

19
Tobias

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);
0
hey