我最近遇到了这样的情况:
class A
{
public:
typedef struct/class {...} B;
...
C::D *someField;
}
class C
{
public:
typedef struct/class {...} D;
...
A::B *someField;
}
通常你可以声明一个类名:
class A;
但是你不能转发声明一个嵌套类型,以下导致编译错误 .
class C::D;
有任何想法吗?
6 回答
你不能这样做,这是C语言的一个漏洞 . 您必须取消嵌套至少一个嵌套类 .
我需要一个前向引用,如:
我的解决方法是:
后来我可以使用完整的定义:
如果有复杂的构造函数或其他特殊的成员函数没有顺利继承,那么这种技术可能比它的 Value 更麻烦 . 我可以想象某些模板魔法反应很糟糕 .
但在我非常简单的情况下,它似乎工作 .
如果你真的想避免#include头文件中令人讨厌的头文件,你可以这样做:
hpp file:
cpp file
但是之后:
您必须在调用时指定嵌入类型(特别是如果您的函数不采用嵌入类型的任何参数)
你的功能不能是虚拟的(因为它是一个模板)
所以,是的,权衡......
这可以通过 forward declare the outer class as a namespace 来完成 .
示例:我们必须使用嵌套类others :: A :: Nested in others_a.h,这是我们无法控制的 .
others_a.h
my_class.h
my_class.cpp
我不会称之为答案,但仍然是一个有趣的发现:如果你在名为C的命名空间中重复结构的声明,一切都很好(至少在gcc中) . 当找到C的类定义时,它似乎无声地覆盖了namspace C.
这将是一种解决方法(至少对于问题中描述的问题 - 不是针对实际问题,即,当无法控制
C
的定义时):