2015-12-30 17 views
11

在C的typedef一個struct,我不能做到這一點:如何在C++中聲明一個自引用容器?

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

因爲node_t不知道,直到它被定義,所以它不能在自己的定義中使用。一點點Catch-22。不過,我可以使用此解決方案,使所需的自我指涉的類型:

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

同樣,我想爲一個C++容器指自己做這樣的事情:

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

,但當然,編譯器會抱怨說,在定義node_t之前,它從來沒有聽說過node_t,就像上面的struct typedef那樣。

那麼有沒有類似於struct的解決方法?或者更好的方法來做到這一點? (不,我不想使用void指針。)

+0

這是否有幫助:[STL映射到本身?](http://stackoverflow.com/questions/1403501/stl-map-onto-itself) –

+2

你可以看看http://www.boost的實現。 org/doc/libs/1_57_0/boost/variant/recursive_variant.hpp或http://www.boost.org/doc/libs/1_57_0/boost/variant/recursive_wrapper.hpp – ForEveR

+1

您的第一個案例在C++中是沒有問題的:'struct node_t {node_t * left'node_t * right; };'很好。另外,'std :: pair'不是一個容器。 – juanchopanza

回答

8

你可以這樣說:

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

經過編譯器知道與名node_t類型存在,類似於向前聲明。

+0

完美。謝謝。 –

3

該語言不支持typedef的前向聲明。因此,你不能使用:

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

可以完成使用struct node_t {...};,這我相信無須贅述一個容器的概念。