为什么我不能在C ++中的限定名称空间中转发声明类型?

时间:2015-11-20 21:03:44

标签: c++ namespaces forward-declaration

我试图避免在我自己的标题内包含一个自动生成的标题(在我的控制之外)。因此,我需要向前声明一个存在于名称空间Type内的类型nm,它本身位于全局名称空间中。以下是MyHeader.h的示例:

// My project defines two levels of nested namespaces 
namespace foo { namespace bar {
    namespace nm { struct Type; }
    ...
} }

不幸的是,这定义了新的命名空间foo::bar::nm并向前声明了类型foo::bar::nm::Type,这不是我想要的。理想情况下,我可以在限定名称空间::nm中转发声明类型:

namespace foo { namespace bar {
    namespace ::nm { struct Type; }
    ...
} }

我的编译器抱怨我不能在这里使用合格的命名空间(使用带有C ++ 11设置的Intel ICC15)。这迫使我把所有这些前瞻性声明放在​​开头:

namespace nm { struct Type; }
namespace foo { namespace bar {
    ...
} }

在我的情况下,这是不方便的,因为我需要向前声明许多类型,并且我希望在我的标题中的各个分散的位置中与我自己的定义一起这样做。解决方法可能是不断地“关闭”和“重新打开”我的嵌套命名空间,这是不理想的。

为什么我不能在限定名称空间中转发声明类型?

3 个答案:

答案 0 :(得分:2)

因为C ++标准是这样说的。

答案 1 :(得分:0)

我知道没有真正的理由。这可能是不受支持的,可能没有人需要它,也没有人要求它。我在你的特定情况下看到了好处,但由于预期的前向声明是在一个单独的文件中提供的,所以你最好只需创建一个自己的*_fwd.h并在其中包含所有前向声明。命名空间。

答案 2 :(得分:0)

你不能,因为它含糊不清。如果你写了:

extern int foo::bar;

您是否在名称空间int中声明bar名为foo,或者您是否在类{{1}内声明int名为bar }}?编译器无法知道。