【发布时间】:2016-02-23 11:48:15
【问题描述】:
我试图避免在我自己的标题中包含自动生成的标题(在我的控制之外)。因此,我需要前向声明一个类型 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 设置的英特尔 ICC15)。这迫使我将所有这些前置声明放在开头:
namespace nm { struct Type; }
namespace foo { namespace bar {
...
} }
在我的情况下,这很不方便,因为我需要前向声明许多类型,并且更愿意在我的标题中的各个分散位置与我自己的定义一起这样做。一种解决方法可能是不断“关闭”和“重新打开”我的嵌套命名空间,这并不理想。
为什么我不能在限定的命名空间中前向声明一个类型?
【问题讨论】:
-
尝试更改原来的命名空间类....据我所知,我的一位同事正在将他自己的自定义设置到命名空间......尽管我可能错了,因为他可能有一直在尝试做其他事情,但我误解了它............C++ 规则和法规(标准)会禁止您尝试做的声明,但不会禁止您尝试或尝试自定义标准或定义,只要它们可以............我知道我刚才说的太复杂了,但我希望你知道我的意思。
标签: c++ namespaces forward-declaration