我想编写这样的代码,但它不起作用:
struct ast;
struct parser;
struct parser
{
struct node
{
node *parent;
};
ast build_ast() //here we want to use object of ast tyoe
{
node *ret = new node;
return ast(ret);
}
};
struct ast
{
parser::node *root; //here we try to access member struct of y
ast(parser::node *rt):root(rt){}
};
问题是我尝试在解析器中创建一个不完整类型的对象。如果我交换结构的实现,问题是我尝试访问不完整类型的成员结构。显然,我可以通过使节点成为一个独立的结构来解决这个问题,但这看起来很糟糕,因为我可能希望在我的程序中有其他节点类型。 问题是:我可以以某种方式在解析器结构之外进行节点结构的前向声明吗?例如:
struct ast;
struct parser;
struct parser::node; //making a forward declaration of member struct
如果无法做到这一点,解决冲突的方法是什么?
答案 0 :(得分:0)
您必须推迟nom
的定义,直到named!(record<Record>, chain!
( latch: le_u32
~ total_energy: le_f32
~ x_cm: le_f32
~ y_cm: le_f32
~ x_cos: le_f32
~ y_cos: le_f32
~ weight: le_f32
, {
Record {
latch: latch,
total_energy: total_energy,
x_cm: x_cm,
y_cm: y_cm,
x_cos: x_cos,
y_cos: y_cos,
weight: weight,
}
}
)
);
为完整类型:
build_ast
ast
在这里使这个声明在功能上与你在例子中的相同。您可能希望将其删除并将inline ast build_ast(); //here we want to use object of ast type
移至实施文件
结构定义之外:
inline
要转发声明build_ast
,您需要在ast parser::build_ast()
{
node *ret = new node;
return ast(ret);
}
定义中执行此操作。换句话说,如果不定义外部,则无法转发声明内部类。
node
然后,您可以继续定义:
parser