我很惊讶地发现我无法使用范围解析运算符转发从另一个范围声明一个类,即
class someScope::someClass;
相反,必须按如下方式使用完整声明:
namespace
{
class someClass;
}
有人可以解释为什么会这样吗?
更新:澄清一下,我问 为什么 就是这种情况。
答案 0 :(得分:7)
您不能在其命名空间之外声明一个类,因为编译器无法识别 someScope 的类型。
需要namespace {} 来声明命名空间的存在,然后将 class someClass 声明到您的范围内。
答案 1 :(得分:6)
好像答案在于C ++规范:
3.3.5标准中的“命名空间范围”。
在命名空间体中声明的实体 据说是该组织的成员 命名空间和引入的名称 这些声明进入了 命名空间的声明性区域 据说是会员的名字 命名空间。
命名空间成员也可以 在:: scope之后引用 应用于分辨率运算符(5.1) 其名称空间的名称或名称 提名的命名空间 成员的命名空间 使用指示符;
答案 2 :(得分:1)
我不确定为什么。也许是因为,在您的第一个代码段中,someScope
未声明。它可以是命名空间,也可以是类名。如果someScope是一个类名,则不能独立转发声明另一个类的类成员。