Vorlagen der geschachtelten Klasse

Vorlagen können in Klassen oder Klassenvorlagen definiert werden. In diesem Fall werden sie als Membervorlagen bezeichnet.Membervorlagen Klassen sind, werden als Vorlagen der geschachtelten Klasse.Membervorlagen, in denen Funktionen sind, werden in Memberfunktions-Vorlagenerläutert.

Vorlagen der geschachtelten Klasse werden als Klassenvorlagen innerhalb des Bereichs der äußeren Klasse deklariert.Sie können im einschließenden Klasse innerhalb oder außerhalb definiert sein.

Beispiel

Im folgenden Code wird eine Vorlage der geschachtelten Klasse innerhalb einer normalen Klasse.

// nested_class_template1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

class X
{

   template <class T>
   struct Y
   {
      T m_t;
      Y(T t): m_t(t) { }   
   };

   Y<int> yInt;
   Y<char> yChar;

public:
   X(int i, char c) : yInt(i), yChar(c) { }
   void print()
   {
      cout << yInt.m_t << " " << yChar.m_t << endl;
   }
};

int main()
{
   X x(1, 'a');
   x.print();
}

Wenn Vorlagen der geschachtelten Klasse außerhalb des einschließenden Klasse definiert sind, müssen sie von der Vorlagenparameter für die Klassenvorlage vorangestellt werden ,wenn sie Mitglieder einer Klassenvorlage sind) und Vorlagenparameter für den Member.

// nested_class_template2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

template <class T>
class X
{
   template <class U> class Y
   {
      U* u;
   public:
      Y();
      U& Value();
      void print();
      ~Y();
   };

   Y<int> y;
public:
   X(T t) { y.Value() = t; }
   void print() { y.print(); }
};

template <class T> 
template <class U>
X<T>::Y<U>::Y()
{
   cout << "X<T>::Y<U>::Y()" << endl;
   u = new U();
}

template <class T> 
template <class U>
U& X<T>::Y<U>::Value()
{
   return *u;
}

template <class T> 
template <class U>
void X<T>::Y<U>::print()
{
   cout << this->Value() << endl;
}

template <class T> 
template <class U>
X<T>::Y<U>::~Y()
{
   cout << "X<T>::Y<U>::~Y()" << endl;
   delete u;
}

int main()
{
   X<int>* xi = new X<int>(10);
   X<char>* xc = new X<char>('c');
   xi->print();
   xc->print();
   delete xi;
   delete xc;
}

Output

1 a

Output

X<T>::Y<U>::Y()
X<T>::Y<U>::Y()
10
99
X<T>::Y<U>::~Y()
X<T>::Y<U>::~Y()

Lokalen Klassen sind nicht zulässig, um Membervorlagen haben.

Siehe auch

Referenz

Klassenvorlagen

Vorlagen der Memberfunktion