【问题标题】:Why can't I forward-declare a type in a qualified namespace in C++?为什么我不能在 C++ 的限定命名空间中前向声明类型?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你不能,因为它是模棱两可的。如果你写:

      extern int foo::bar;
      

      您是在命名空间foo 中前向声明一个名为barint,还是在类foo 中前向声明一个名为barint?编译器无法知道。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 2012-12-27
        • 1970-01-01
        • 2015-05-10
        • 2011-09-20
        相关资源
        最近更新 更多