在命名空间中转发声明类

Posted

技术标签:

【中文标题】在命名空间中转发声明类【英文标题】:Forward declaring classes in namespaces 【发布时间】:2011-03-17 19:48:11 【问题描述】:

我很惊讶地发现我无法使用范围解析运算符从另一个范围内转发声明一个类,即

class someScope::someClass;

相反,必须按如下方式使用完整声明:

namespace

    class someClass;

有人能解释一下为什么会这样吗?

更新:为了澄清,我问为什么会出现这种情况。

【问题讨论】:

重复:***.com/questions/1368642/… 技术答案,来自该问题:***.com/questions/1368642/… 【参考方案1】:

您不能在其命名空间之外声明一个类,因为编译器无法识别 someScope 的类型。

namespace 需要声明命名空间的存在,然后,将 class someClass 声明到您的作用域中。

【讨论】:

你没有回答我的问题,我在问为什么会这样,而不是如何解决它——我已经知道了。 :-) 恕我直言,选择这个决定是为了区分 someClass::someMember 和 someNamespace::someClass。不然怎么处理?【参考方案2】:

似乎答案就在 C++ 规范中:

3.3.5 标准中的“命名空间范围”。

在命名空间主体中声明的实体 据说是成员 命名空间,以及由 这些声明进入 命名空间的声明区域 据说是 命名空间。

命名空间成员也可以是 在 :: 范围之后引用 分辨率运算符(5.1)应用于 其命名空间的名称或名称 命名空间的名称 成员的命名空间在 使用指令;

【讨论】:

【参考方案3】:

我不知道为什么。可能是因为,在您的第一个代码 sn-p 中,someScope 未声明。它可以是命名空间,也可以是类名。如果 someScope 是类名,则不能独立转发声明另一个类的类成员。

【讨论】:

以上是关于在命名空间中转发声明类的主要内容,如果未能解决你的问题,请参考以下文章

转发在C ++中声明隐藏的typedef

为啥我们不能在一个类中声明一个命名空间?

为啥我不能使用双冒号在命名空间中前向声明一个类?

如何减轻类声明远离文件中的所有者命名空间声明?

将在自动加载的命名空间类文件中声明的函数转换为全局函数

如何在类模板中使用文件范围的命名空间声明?