我最近遇到了这样的情况:
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;
有什么想法吗?
发布于 2009-06-04 15:23:10
您不能这样做,这是C++语言中的一个漏洞。您必须取消至少一个嵌套类的嵌套。
发布于 2011-11-07 09:22:23
class IDontControl
{
class Nested
{
Nested(int i);
};
};
我需要一个前瞻性的参考,比如:
class IDontControl::Nested; // But this doesn't work.
我的解决方法是:
class IDontControl_Nested; // Forward reference to distinct name.
稍后当我可以使用完整的定义时:
#include <idontcontrol.h>
// I defined the forward ref like this:
class IDontControl_Nested : public IDontControl::Nested
{
// Needed to make a forwarding constructor here
IDontControl_Nested(int i) : Nested(i) { }
};
如果有复杂的构造函数或其他不能顺利继承的特殊成员函数,这种技术可能会带来更多的麻烦。我可以想象某些模板的魔法会有不好的反应。
但在我非常简单的例子中,它似乎是有效的。
发布于 2009-06-04 15:48:03
我不认为这是一个答案,但是有一个有趣的发现:如果你在一个名为C的命名空间中重复声明你的struct,一切都很好(至少在gcc中是这样)。当找到C的类定义时,它似乎会默默地覆盖名称空间C。
namespace C {
typedef struct {} D;
}
class A
{
public:
typedef struct/class {...} B;
...
C::D *someField;
}
class C
{
public:
typedef struct/class {...} D;
...
A::B *someField;
}
https://stackoverflow.com/questions/951234
复制相似问题