首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++中嵌套类型/类的正向声明

C++中嵌套类型/类的正向声明
EN

Stack Overflow用户
提问于 2009-06-04 15:20:39
回答 5查看 62.3K关注 0票数 226

我最近遇到了这样的情况:

代码语言:javascript
复制
class A
{
public:
    typedef struct/class {…} B;
…
    C::D *someField;
}

class C
{
public:
    typedef struct/class {…} D;
…
    A::B *someField;
}

通常,您可以声明一个类名:

代码语言:javascript
复制
class A;

但是你不能向前声明一个嵌套类型,下面的代码会导致编译错误。

代码语言:javascript
复制
class C::D;

有什么想法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-04 15:23:10

您不能这样做,这是C++语言中的一个漏洞。您必须取消至少一个嵌套类的嵌套。

票数 254
EN

Stack Overflow用户

发布于 2011-11-07 09:22:23

代码语言:javascript
复制
class IDontControl
{
    class Nested
    {
        Nested(int i);
    };
};

我需要一个前瞻性的参考,比如:

代码语言:javascript
复制
class IDontControl::Nested; // But this doesn't work.

我的解决方法是:

代码语言:javascript
复制
class IDontControl_Nested; // Forward reference to distinct name.

稍后当我可以使用完整的定义时:

代码语言:javascript
复制
#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) { }
};

如果有复杂的构造函数或其他不能顺利继承的特殊成员函数,这种技术可能会带来更多的麻烦。我可以想象某些模板的魔法会有不好的反应。

但在我非常简单的例子中,它似乎是有效的。

票数 38
EN

Stack Overflow用户

发布于 2009-06-04 15:48:03

我不认为这是一个答案,但是有一个有趣的发现:如果你在一个名为C的命名空间中重复声明你的struct,一切都很好(至少在gcc中是这样)。当找到C的类定义时,它似乎会默默地覆盖名称空间C。

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/951234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档