Udostępnij za pośrednictwem


Zagnieżdżone szablony klasy

Szablony mogą być definiowane w obrębie klasy lub klasy szablony, w którym to przypadku one są określane jako szablony Członkowskich.Szablony Członkowskie klas są nazywane szablonów zagnieżdżonych klasy.Szablony Członkowskich funkcje są omówione w Członkowskich funkcji szablonów.

Klasa zagnieżdżone szablony są deklarowane jako szablony klasy wewnątrz zakresu klasy zewnętrzne.Mogą być definiowane wewnątrz lub na zewnątrz otaczający klasy.

Przykład

Poniższy kod demonstruje szablonu klasy zagnieżdżone wewnątrz klasy zwykłych.

// 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();
}

Klasa zagnieżdżone szablony są zdefiniowana poza ich otaczający klasy, musi być poprzedzona przez parametry szablonu zarówno szablonu klasy (jeśli są oni członkami szablonu klasy) i parametry szablonu szablon Członkowskie.

// 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;
}

Dane wyjściowe

1 a

Dane wyjściowe

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

Klasy lokalne nie są dozwolone Członkowskie szablony.

Zobacz też

Informacje

Szablony klasy

Szablony funkcji Członkowskich