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

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

class someScope::someClass;

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

namespace
{
    class someClass;
}

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

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

【问题讨论】:

标签: c++ scope namespaces declaration


【解决方案1】:

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

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

【讨论】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 2013-09-30
      • 1970-01-01
      • 2013-03-05
      • 2011-06-14
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      相关资源
      最近更新 更多