2010-07-19 164 views
13

转发声明类我非常惊讶地得知,我无法向前从另一个范围使用范围解析运算符声明一个类,即在命名空间

class someScope::someClass; 

相反,完整的声明已被用作如下:

namespace 
{ 
    class someClass; 
} 

有人可以解释为什么会出现这种情况吗?

更新:澄清,我要求为什么这是这种情况。

+0

Duplicate:http://stackoverflow.com/questions/1368642/is-there-a-shorter-way-to-forward-declare-a-class-in-a-namespace技术答案,从这个问题:http://stackoverflow.com/questions/1368642/is-there-a-shorter-way-to-forward-declare-a-class-in-a-namespace/1368738#1368738 – GManNickG 2010-07-19 09:26:05

回答

6

好像答案就在C++规格:标准

3.3.5 “命名空间内”。名称空间中的体 声明

实体被说成是 命名空间的成员,并且通过引入 名称这些声明到命名空间 的 声明性区域被认为是 命名空间的成员名称。

命名空间构件还可以是 应用于 其命名空间的名称或它的名称提名 构件的名字空间在 using-一个命名空间的 (5.1)的范围::分辨率 操作之后称为指示;

1

我不知道为什么。也许是因为在你的第一个代码片段中,someScope是未声明的。它可以是名称空间或类名。如果someScope是一个类名,你不能独立地转发声明另一个类的类成员。

8

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

命名空间{}需要申报命名空间的存在,然后宣布类SomeClass的到你的范围。

+0

你不回答我的问题,虽然,我在问为什么这种情况不是如何绕过它 - 我已经知道了。 :-) – Konrad 2010-07-19 10:07:39

+1

恕我直言,这个决定被选中,以区分someClass :: someMember和someNamespace :: someClass。如何处理呢? – Doomsday 2010-07-19 10:46:43