如何在C++中声明自引用容器?

Mar*_*ler 11 c++ containers typedef self-reference

对于C中typedef的a struct,我不能这样做:

typedef struct {
    unsigned id;
    node_t *left;
    node_t *right;
} node_t;
Run Code Online (Sandbox Code Playgroud)

因为node_t直到它被定义才知道,所以它不能用在它自己的定义中.有点像Catch-22.但是,我可以使用此变通方法来创建所需的自引用类型:

typedef struct node_s node_t;
struct node_s {
    unsigned id;
    node_t *left;
    node_t *right;
};
Run Code Online (Sandbox Code Playgroud)

同样,我想对引用自身的C++容器做类似的事情:

typedef pair<unsigned, pair<node_t *, node_t * > > node_t;
Run Code Online (Sandbox Code Playgroud)

但是当然,编译器抱怨它node_t在定义之前从未听说过node_t,就像struct typedef上面所说的那样.

那么有没有像这样的解决方法struct?还是一些更好的方法来做到这一点?(不,我不想使用void指针.)

Rab*_*d76 10

你可以这样做:

struct node_t : std::pair<unsigned, std::pair<node_t *, node_t * > >
{};
Run Code Online (Sandbox Code Playgroud)

经过struct node_t编译器知道有名称的类型node_t存在,类似于向前声明.