问题 如何在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 指针。)


8801
2017-12-30 07:38


起源

这有用吗: STL映射到自身? - Rahul Tripathi
你可以看看实现 boost.org/doc/libs/1_57_0/boost/variant/recursive_variant.hpp 要么 boost.org/doc/libs/1_57_0/boost/variant/recursive_wrapper.hpp - ForEveR
你的第一个案例是C ++中的一个非问题: struct node_t { node_t* left' node_t* right; }; 很好。也, std::pair 不是一个容器。 - juanchopanza
啊,对不起我正在经历 维基百科STL页面 这说的 pair 是一个“简单的容器”。是的,我知道第一种情况不是C ++中的问题,这就是为什么我用“在C中”澄清的原因。 - Mark Adler


答案:


你可以这样做:

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

struct node_t 编译器知道具有名称的类型 node_t 存在,类似于前瞻性声明。


8
2017-12-30 08:14



完善。谢谢。 - Mark Adler


该语言不支持前向声明 typedef秒。因此,你不能使用:

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

你可以完成一个概念 容器 运用 struct node_t {...};,我相信不需要详细说明。


3
2017-12-30 07:50