2009-08-23 11 views
5

Ho davvero bisogno di tre affermazioni, vale a dire come questoavanti-dichiarando puntatore template

class A; 
template<class _T> class B; 
typedef B<A> C; 

per inoltrare-dichiarare un puntatore di template tipo C, in questo modo:

C* c = 0; 

speravo di essere in grado di nascondere le classi A e B nella mia forward-declaration, è possibile?

+0

E il metodo a 2 righe di litb è un po 'meno semplice. – rlbond

+0

@rlbond, spostato a una risposta e rimosso il codice spaventoso a 2 righe –

risposta

8

Anche se non è esattamente la stessa cosa, si potrebbe fare questo, invece:

class C; 
C* c = 0; 

e poi più tardi, nel file di implementazione, dopo che i file di intestazione per " a" e 'B' sono state incluse, definire 'C' come questo:

class C : public B<A> {}; 

Utilizzando l'ereditarietà al posto di un typedef dovrebbe funzionare se avete solo bisogno di usare il costruttore di default di B <a>.

+0

MODIFICA: non è necessario inoltrare le dichiarazioni "A" e "B" nel file di implementazione. Dovrebbero essere inclusi i file di intestazione. – Ropez

+0

Non quello che avevo in mente, ma un grande suggerimento. Grazie! –

+0

Una soluzione davvero utile e intelligente, grazie, @Ropez! – Steed

1

Non capisco davvero la vostra domanda, ma il codice come questo:

template<class _T> class B; 

è illegale. C++ riserva i nomi iniziando con un carattere di sottolineatura e una lettera maiuscola per l'implementazione della libreria del compilatore & - non è consentito utilizzarli nel proprio codice.

+0

grazie a questo aiuto per me –

3

Sì, è necessario. Nota che tutte e tre le linee fanno cose diverse. Il primo dichiara una classe. Il secondo dichiara un modello e il terzo dichiara un nome typedef. Nel dichiarare il typedef-name, puoi usare un identificatore di tipo elaborato come "class A" per nominare la classe senza avere il suo nome in scope (con alcune insidie ​​pericolose incluse) - ma non puoi ulteriormente comprimere la dichiarazione del template con la dichiarazione typedef.

Non mi preoccuperei delle tre linee. Se è necessario, vorrei solo li scrivere :)

+0

Speravo che, poiché lo sto usando solo per un puntatore privato, ci sarebbe un bel modo di riservare lo spazio necessario senza dover rivelare i dettagli sottostanti. –

+0

Cosa intendi? Puoi per favore scrivere il codice nella domanda su come desideri che dovrebbe apparire e come appare ora? Penso che possiamo quindi comprenderlo meglio –

Problemi correlati