嵌套朋友类所需的前向声明

Joh*_*ski 1 c++ nested class declaration forward

假设我有两个类定义如下:

class obj1
{
  private:
    int mem;
    void method1();

  friend class obj2;
};

class obj2
{
  public:
    void method2();
};

void obj2::method2()
{
  obj1 test;
  test.mem = 59999;
  std::cout << test.mem;
  return;
}
Run Code Online (Sandbox Code Playgroud)

这非常有效.在main中,如果我声明一个obj2类型的对象然后调用它的method2成员函数,它可以成功地从obj1的实例访问私有变量.现在,假设我将这些类嵌套:

class parent
{
  public:
  class obj1
  {
    private:
      int mem;
      void method1();

    friend class obj2;
  };

  class obj2
  {
    public:
      void method2();
  };
  void my_function();
};

void parent::obj2::method2()
{
  obj1 test;
  test.mem = 59999;
  std::cout << test.mem;
  return;
}

void parent::my_function()
{
  obj2 test2;
  obj2.method2();
  return;
}
Run Code Online (Sandbox Code Playgroud)

这不会编译.它说"mem"是私有的,即使obj2被宣布为朋友类.我可以解决这个问题的唯一方法是将类obj2的前向声明放在obj1类的定义之前.但是如果类没有嵌套,我不必这样做. 为什么是这样?

Die*_*ühl 5

声明的类friendfriend声明的上下文中查找.如果找到一个,这个类就成了一个friend.如果没有找到,则在最近的命名空间级别声明该类,并将该类设为a friend.该friend声明不会引入一个嵌套类的名称.但是它会创建一个嵌套的类a friend.