【问题标题】:Naming conflict with multiple namespaces?与多个命名空间的命名冲突?
【发布时间】:2015-02-10 02:36:04
【问题描述】:

我习惯了 Java/C# 处理包的方式。尽管我的大部分工作都是用 C++ 完成的,但我已经有一段时间远离命名空间了。

我知道我可以有多个这样的命名空间:

namespace A
{
    class Foo;
}

namespace B
{
    namespace C
    {
        class Bar;
    }
}

这很好。我想要理解的是以下场景:

namespace A
{
    class Foo;
}

namespace B
{
    namespace A
    {
        class Bar : public A:Foo //here A shows up as namespace B::A
        {
        };
    }
}

在 Java 中,如果我要编写一个包装器,我会这样做。假设我试图将 Artemis 框架移植到我的引擎中。如果我需要编写一个完整的包装器,它会被命名为 MyEngine.Artemis 包名。

在 C++ 中,这可能吗?更重要的是,这是处理此类任务的适当方式吗?

【问题讨论】:

  • 您也可以使用范围运算符:: 来指示全局范围,例如::A::Foo
  • @JoachimPileborg 将其作为答案发布。我花了几个小时试图弄清楚!

标签: c++ namespaces


【解决方案1】:

在诸如您的上下文中使用非限定名称时,名称查找将开始检查最内部的封闭范围,然后再检查外部范围。特别是,在命名空间B 中声明的任何名称都会在全局命名空间中声明的任何名称之前考虑。
因此首先找到命名空间B::A,在::A之前 - 显然B::A中没有成员Foo。请注意,有两个不同的命名空间可以在您的代码中使用A 进行寻址,但如果没有进一步的限定,只能找到一个。

所以写

namespace B
{
    namespace A
    {
        class Bar : public ::A::Foo
        {
        };
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2011-12-30
    • 2012-09-10
    • 2013-01-26
    • 2010-11-15
    相关资源
    最近更新 更多