Compartir a través de


Plantillas de clase anidada

Las plantillas pueden definirse dentro de clases o plantillas de clase, en cuyo caso se conocen como plantillas de miembro.Las plantillas de miembro que son clases se conocen como plantillas de clase anidada.Las plantillas de miembro que son funciones se tratan en Plantillas de función miembro.

Las plantillas de clase anidada se declaran como plantillas de clase dentro del ámbito de la clase externa.Pueden ser definido dentro o fuera de la clase envolvente.

Ejemplo

El código siguiente se muestra una plantilla de clase anidada dentro de una clase ordinaria.

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

Cuando las plantillas de clase anidada son fuera definido de la clase envolvente, deben presentarse por los parámetros de plantilla para la plantilla de clase (si son miembros de una plantilla de clase) y los parámetros de plantilla para la plantilla de miembro.

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

Las clases locales no se permiten tener plantillas de miembro.

Vea también

Referencia

Plantillas de clase

Plantillas de función miembro