class a;
class b;
class a {
b c;
};
class b {
};
为什么不编译?我的印象是,如果你宣布了类的原型,它们的声明顺序并不重要。但是,这不起作用。在视觉工作室,它给了我:
error C2079: 'a::c' uses undefined class 'b'
在g ++中,它给了我:
error: field 'c' has incomplete type
我做错了什么?
答案 0 :(得分:2)
当编译器看到
时class a {
b c;
};
它知道b
存在,但它不知道它是什么(因此,它不知道它需要多少空间,因此它不知道如何构建{{1} })
但是,您可以使用a
上的指针:
b
编辑:
这意味着您无法在定义class a {
b* c;
};
之前对其进行操作。例如:你无法做到:
b
可以执行的操作将class a {
b* c;
void f(){
c->doSomething(); // <- Won't compile
}
};
和a
中的.hh
定义分开:
.cc
在a.cc
class b; //Say it exists. Don't say what it looks like
class a {
b* c;
void f();
};
答案 1 :(得分:0)
当a
使用b
时,它已被声明(因为您在其上面写了class b;
)但未定义(定义低于a
)。 “不完整类型”表示已声明但未定义的类型。