对于C中typedef
的{{1}},我无法执行此操作:
struct
因为typedef struct {
unsigned id;
node_t *left;
node_t *right;
} node_t;
在定义之前是未知的,所以它不能在自己的定义中使用。有点像Catch-22。但是,我可以使用此变通方法来创建所需的自引用类型:
node_t
同样,我想对引用自身的C ++容器做类似的事情:
typedef struct node_s node_t;
struct node_s {
unsigned id;
node_t *left;
node_t *right;
};
但当然,编译器抱怨它在定义typedef pair<unsigned, pair<node_t *, node_t * > > node_t;
之前从未听说过node_t
,就像上面的node_t
一样。< / p>
那么有struct typedef
的解决方法吗?还是一些更好的方法来做到这一点? (不,我不想使用struct
指针。)
答案 0 :(得分:10)
你可以这样做:
struct node_t : std::pair<unsigned, std::pair<node_t *, node_t * > >
{};
在struct node_t
之后,编译器知道名称为node_t
的类型存在,类似于前向声明。
答案 1 :(得分:4)
该语言不支持Holder.holder.value == 0
的前向声明。因此,你不能使用:
typedef
您可以使用typedef pair<unsigned, pair<node_t *, node_t * > > node_t;
来完成容器的概念,我确信无需详细说明。
答案 2 :(得分:0)
您可以自引用结构指针(如果您为其命名)(即typedef struct <name> {...}
)。我通常使用以下成语:
typedef struct _node_t { // "Temporary" name "_node_t"
unsigned id;
struct _node_t *left; // Have to use "struct _node_t"
struct _node_t *right;
} node_t; // "Final" name
这基本上将先前的答案应用于实际代码。