繁体   English   中英

为什么我不能在C ++中的合格名称空间中向前声明类型?

[英]Why can't I forward-declare a type in a qualified namespace in C++?

我试图避免在自己的标头内部包含自动生成的标头(控件之外)。 因此,我需要向前声明一个驻留在名称空间nm的类型Type ,该类型本身位于全局名称空间中。 这是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; }
    ...
} }

我的编译器抱怨我不能在此处使用合格的名称空间(将Intel ICC15与C ++ 11设置一起使用)。 这迫使我在开始时就将所有这些前瞻性声明放在​​首位:

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

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

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

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

我没有真正的原因。 只是不支持此功能,可能没有人需要它,也没有人要求它。 我看到了在您的特定情况下的好处,但是由于预期将在单独的文件中提供前向声明,因此,最好通过在单个名称空间中创建带有所有前向声明的自己的*_fwd.h来更好。 。

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

extern int foo::bar;

你向前声明一个int名为bar的命名空间foo ,或者是你前进的声明int命名bar里面的类foo 编译器无法知道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM