转发声明命名空间中的类

Kon*_*rad 14 c++ scope namespaces declaration

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

class someScope::someClass;
Run Code Online (Sandbox Code Playgroud)

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

namespace
{
    class someClass;
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么会这样吗?

更新:澄清一下,我在问为什么会这样.

Doo*_*day 7

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

namespace {}需要声明命名空间的存在,然后将someClass类声明到您的范围中.

  • 恕我直言,选择此决定是为了区分 someClass::someMember 和 someNamespace::someClass。否则怎么处理呢? (2认同)

Kon*_*rad 6

似乎答案在于C++规范:

3.3.5标准中的"命名空间范围".

在namespace-body中声明的实体被称为命名空间的成员,并且这些声明引入命名空间的声明性区域的名称被称为命名空间的成员名称.

在将:: scope解析运算符(5.1)应用于其名称空间的名称或命名空间的名称之后,也可以引用名称空间成员,该名称空间在using-directive中指定成员的名称空间.