我有以下代码
class foo
{
public:
foo() {}
private:
int foo_int;
friend class bar; //----->Statement A
};
class bar
{
public:
void someMethod()
{
foo f;
f.foo_int = 13;
}
};
现在我也在SO上阅读this回答。但是,为了原因,我无法将拼图拼凑起来 编译器将bar识别为类型。我的印象是,它会抱怨Bar是一个不完整的类型但是没有发生。我的问题是为什么?
答案 0 :(得分:2)
朋友班吧;
只是一个声明......编译器没有什么可抱怨的。对不完整类型的限制是当编译器需要关于它没有的类型的信息时,例如它的大小,或者对于基类,它的成员,但对于friend
它不需要的信息。除了它的名字以外的任何东西。
请注意,friend
声明在类定义中发生的位置并不重要... private:
后面的{{1}}声明并不是私有的。把它放在类定义的顶部会更好。
答案 1 :(得分:1)
尚未声明的类的friend
规范作为该类的声明。将不完整类型声明为类的朋友是完全正确的,因为编译器只需要知道正在声明的类型。