2
#include <iostream>

using namespace std;


class B {
private:
  class A;
  friend void f ( A Aobj );
  B ( int i ) {}
};

class A{
};


void f ( A Aobj ) {
  B Bobj ( 1 );
}

int main() {      
}

g++ 产生以下错误:

$ g++ a.cpp
a.cpp: In function ‘void f(A)’:
a.cpp:10: error: ‘B::B(int)’ is private
a.cpp:18: error: within this context

如果进行以下任何更改,错误就会消失: 1. 从 B 的构造函数中删除“int i”。 2. 将 f 的数据类型从 A 更改为其他任何类型:例如 void f (int Aobj)。3.在B之前定义A类,去掉A的前向声明。

4

2 回答 2

3

问题是友元函数需要一个B::A,而文件中稍后的函数需要一个A. class A移动out of的前向声明B

于 2013-07-02T18:24:08.660 回答
0

您已将 B 的构造函数 - 函数 B (int i){} 声明为私有方法。你想公开这个,像这样:

class B {
private:
  class A;
  friend void f ( A Aobj );
public:
  B ( int i ) {}
};

**已编辑

如果您想让构造函数保持私有,那应该不是问题。再看一遍,我意识到错误在于类 A 的前向声明。您在 B 的类定义中声明了 A,然后尝试在 f 的函数头中使用它。问题是您还没有完全定义 A,因此您还不能引用该对象 - 编译器不知道 A 占用了多少内存,因此无法定义该函数。要解决此问题,您要么需要在对 A 的任何引用之前完全定义类 A,要么切换 f 以获取指向 A 的指针(即void f (A* Aobj))。指针是固定大小的,因此即使 A 尚未完全定义,也可以使用它们。

于 2013-07-02T17:43:02.290 回答