2012-04-20 13 views
5

Para mi tarea, tengo que crear una lista vinculada y debe ser una clase de plantilla. La asignación requiere una clase de plantilla llamada Lista y otra clase de plantilla anidada llamada Enlace.Cómo diseñar clases de plantilla anidadas donde las clases anidadas son del mismo tipo

Los métodos deben definirse fuera de la definición de la clase.

Primero creé una versión simple de la tarea y está funcionando, pero creo que hay un error en mi diseño.

#include <iostream> 
using namespace std; 

template <class T1> 
class A 
{ 
public: 
    template <class T2> 
    class B; 

    T1 _a; 
}; 

template <class T1> 
template <class T2> 
class A<T1>::B 
{ 
public: 
    T2 _b; 
}; 

int main() 
{ 
    A<int> a; 
    a._a = 5; 

    A<int>::B<int> b; 
    b._b = 10; 

    cout << a._a << " " << b._b << "\n"; 


    return 0; 
} 

Mi pregunta principal es, ya que la clase anidada será del mismo tipo, como se puede ver en la declaración A<int>::B<int> b;, ¿hay una manera de tener la clase B sea automáticamente del mismo tipo que el A? ¿Mi pregunta tiene sentido? En otras palabras, ¿puedo hacer A<int>::B b; yb automáticamente del mismo tipo que A? Nunca habrá una situación en la que tendría A<double>::B<int>; por ejemplo.

Respuesta

5

Sí, simplemente haga que B no sea una plantilla. T1 en la definición de B todavía se refiere al argumento de plantilla de A.

template <class T1> 
class A 
{ 
public: 
    class B; 

    T1 _a; 
} 

Ahora, en lugar de A<int>::B<int>, es simplemente A<int>::B.

No tenía sentido tener ninguna plantilla.

+0

bien, estaba pensando que iba a funcionar, tiene que haber sido un problema con mi sintaxis porque seguí recibiendo errores. Lo intentare otra vez. –

1

No veo por qué cree que necesita una plantilla para su clase interna. ¿Has intentado declararlo como una clase sin plantilla? p.ej.

template <class T1> 
class A 
{ 
public: 
    class B; 
private:  
    T1 _a; 
}; 

template <class T1> 
class A<T1>::B 
{ 
    T1 _b; 
}; 

(Asimismo, si bien me doy cuenta de que es sólo un ejemplo, te aconsejo clases de escritura con miembros de datos públicos)

+0

No pensé que fuera necesario, solo estaba cometiendo errores de sintaxis, creo, porque no pude obtener el programa para compilar. Pude arreglarlo desde tu código de muestra. ¡Gracias! –

Cuestiones relacionadas