在GCC中使用朋友课

Use friend class in gcc

本文关键字:朋友 GCC      更新时间:2023-10-16

我有此类在VC14中编译,但是当我尝试在GCC 4.8.5中编译时,它不起作用,我会遇到"错误:C在此范围内未声明C"。

class A
{
};
class B : public A
{
   friend class C;
   friend class D;
private:
   class BB
   {
      std::list<C> c;
      std::list<D> d;
   };
};
class C : public B::BB
{
};
class D : public B::BB
{
};

我试图在B类的定义之前将声明" C"转发为" C类",但是它给了我一个错误,因为它的定义与" C类:public B :: bb"的定义不同,我可以'提出该定义是因为BB是私人的...我不确定该怎么办。

谢谢

使用friend的正向声明与其他正向声明不同。在B的定义中编写friend class C;在 CC_3的定义中声明 在封闭命名空间中称为 C的类( i。范围。因此,您无法写出诸如List<C>之类的东西,因为找不到名称C。您应该这样做:

class C;
class D;
class B : public A
{
   friend class C;
   friend class D;
private:
   class BB
   {
      List<C> c;
      List<D> d;
   }
}

名称空间声明实际上将名称CD引入了全局范围。然后,朋友声明使这些课程成为B的朋友。

当您做

List<C> c;
List<D> d;

编译器不知道CD是什么 - 您还没有声明/实现它们!

您不必完全实施它们,但是您至少需要告诉编译器它们是在某个时候实现的类。您可以使用:

class C;
class D;

完整的工作示例(带有一些次要修复程序,例如添加半olon以使其编译(:ideone