Vnořené šablony třídy
Šablony mohou být definovány v rámci třídy, nebo šablony třídy, v takovém případě označují se jako člen šablony.Člen šablon, které jsou třídy jsou označovány jako šablony vnořené třídy.Člen šablon, které jsou funkce, které jsou zmíněny v Členské funkce šablony.
Šablony vnořené třídy jsou deklarovány jako šablony třídy uvnitř oboru vnější třídy.Mohou být definovány uvnitř nebo mimo ohraničující třídy.
Příklad
Následující kód ukazuje šablony vnořené třídy uvnitř běžné třídy.
// 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();
}
Když vnořené třídy šablon jsou definována mimo jejich ohraničující třídy, musí být uvozena parametry šablony pro obě třídy šablonu (pokud jsou členy třídy šablony) a parametry šablony pro šablonu člen.
// 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;
}
Výsledek
1 a
Výsledek
X<T>::Y<U>::Y()
X<T>::Y<U>::Y()
10
99
X<T>::Y<U>::~Y()
X<T>::Y<U>::~Y()
Místní třídy nelze členské šablony.