2015-12-30 23 views
11

Per un typedef di un struct in C, non posso fare questo:Come dichiarare un contenitore autoreferenziale in C++?

typedef struct { 
    unsigned id; 
    node_t *left; 
    node_t *right; 
} node_t; 

perché node_t non è noto finché non viene definito, quindi non può essere utilizzato nella sua definizione. Un po 'di un Catch-22. Tuttavia, posso utilizzare questa soluzione per rendere il tipo autoreferenziale desiderata:

typedef struct node_s node_t; 
struct node_s { 
    unsigned id; 
    node_t *left; 
    node_t *right; 
}; 

Allo stesso modo, mi piacerebbe fare qualcosa di simile per un ++ contenitore C riferendosi a se stesso:

typedef pair<unsigned, pair<node_t *, node_t * > > node_t; 

ma di Naturalmente, il compilatore si lamenta che non si è mai sentito parlare di node_t prima che sia definito node_t, come per il struct typedef precedente.

Quindi c'è una soluzione come per lo struct? O un modo migliore per farlo? (E no, non voglio usare i puntatori void.)

+0

Questo aiuto: [Mappa STL su sé stesso?] (Http://stackoverflow.com/questions/1403501/stl-map-onto-itself) –

+2

È possibile osservare la realizzazione di http: //www.boost. org/doc/libs/1_57_0/boost/variant/recursive_variant.hpp o http://www.boost.org/doc/libs/1_57_0/boost/variant/recursive_wrapper.hpp – ForEveR

+1

Il tuo primo caso è un non-problema in C++ : 'struct node_t {node_t * left 'node_t * right; }; 'è perfettamente a posto. Inoltre, 'std :: pair' non è un contenitore. – juanchopanza

risposta

8

Si può fare in questo modo:

struct node_t : std::pair<unsigned, std::pair<node_t *, node_t * > > 
{}; 

Dopo struct node_t il compilatore sa che il tipo con il nome node_t esiste, simile a una dichiarazione anticipata.

+0

Perfetto. Grazie. –

3

La lingua non supporta la dichiarazione inoltrata di typedef s. Quindi, non è possibile utilizzare:

typedef pair<unsigned, pair<node_t *, node_t * > > node_t; 

è possibile realizzare il concetto di un contenitore di utilizzando struct node_t {...};, e sono sicuro che non ha bisogno di elaborazione.