在GCC中使用朋友课
Use friend class in gcc
我有此类在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;
}
}
名称空间声明实际上将名称C
和D
引入了全局范围。然后,朋友声明使这些课程成为B
的朋友。
当您做
时List<C> c;
List<D> d;
编译器不知道C
和D
是什么 - 您还没有声明/实现它们!
您不必完全实施它们,但是您至少需要告诉编译器它们是在某个时候实现的类。您可以使用:
class C;
class D;
完整的工作示例(带有一些次要修复程序,例如添加半olon以使其编译(:ideone
相关文章:
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 奇怪的结构&GCC&clang(void*返回类型)
- GCC本机矩阵运算库
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- GCC对可能有效的代码抛出init list生存期警告
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 使用gcc从静态链接的文件中查找可选符号
- 普通环路未使用gcc 4.8.5自动矢量化
- 有了gcc,是否可以链接库,但前提是它存在
- 在clang++预处理器中确定gcc工具链版本
- 为什么 gcc 编译这个而 msvc 没有
- 一位朋友将模板函数缩写为clang和gcc
- "朋友"成员函数和 GCC 与 Clang
- 在GCC中使用朋友课
- 为什么 GCC 不允许在你是朋友时从私有嵌套类继承
- Clang vs. GCC:通过限定/非限定名将全局函数定义为朋友