2012-04-20 11 views
5

Per il mio compito a casa, devo creare un elenco collegato e deve essere una classe template. Il compito richiede una classe template chiamata List e un'altra classe template annidata chiamata Link.Come progettare classi template annidate in cui classi annidate sono dello stesso tipo

I metodi devono essere definiti al di fuori della definizione della classe.

Ho creato una versione semplice del compito e sta funzionando, ma ritengo che ci sia un errore nel mio progetto.

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

mia domanda principale è, dal momento che la classe annidata sarà dello stesso tipo, come si può vedere dalla dichiarazione A<int>::B<int> b;, c'è un modo per avere classe B sia automaticamente dello stesso tipo A? La mia domanda ha senso? In altre parole, posso fare A<int>::B b; e b automaticamente lo stesso tipo di A? Non ci sarà mai una situazione in cui vorrei avere A<double>::B<int>; per esempio.

risposta

5

Sì, è sufficiente creare il modello B. T1 nella definizione di B si riferisce ancora all'argomento modello di A.

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

    T1 _a; 
} 

Ora, invece di A<int>::B<int>, è semplicemente A<int>::B.

List<int>::Link<double> non avrebbe alcun senso, quindi non ha senso essere un modello.

+0

OK, ho pensato che avrebbe funzionato, ci deve essere stato un problema con la mia sintassi quindi perché continuavo a ricevere errori. Ci riproverò. –

1

Non riesco a capire perché pensi di aver bisogno di un modello per la tua classe interiore. Hai provato a dichiararlo come una classe non modello? per esempio.

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

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

(Inoltre, mentre mi rendo conto che è solo un esempio, vorrei consigliare contro corsi di scrittura con membri dati pubblici)

+0

Non pensavo fosse necessario, stavo solo facendo errori di sintassi perché non riuscivo a compilare il programma. Sono stato in grado di correggere dal tuo codice di esempio. Grazie! –

Problemi correlati