Geschachtelte Klassenvorlagen
Vorlagen können in Klassen oder Klassenvorlagen definiert werden. In diesem Fall werden sie als Membervorlagen bezeichnet. Membervorlagen, die Klassen sind, werden als geschachtelte Klassenvorlagen bezeichnet. Membervorlagen, die Funktionen sind, werden in Memberfunktionsvorlagen erläutert.
Geschachtelte Klassenvorlagen werden als Klassenvorlagen innerhalb des Bereichs der äußeren Klasse deklariert. Sie können innerhalb oder außerhalb der einschließenden Klasse definiert sein.
Beispiel
Das folgende Codebeispiel zeigt eine verschachtelte Klassenvorlage 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 geschachtelte Klassenvorlagen außerhalb der einschließenden Klasse definiert sind, müssen ihnen die Vorlagenparameter für die Klassenvorlage (wenn sie Member einer Klassenvorlage sind) und die Vorlagenparameter für die Membervorlage vorangestellt werden.
// 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;
}
Ausgabe
1 a
Ausgabe
X<T>::Y<U>::Y()
X<T>::Y<U>::Y()
10
99
X<T>::Y<U>::~Y()
X<T>::Y<U>::~Y()
Lokale Klassen dürfen keine Membervorlagen haben.