命名与多个名称空间的冲突?

时间:2015-02-09 18:29:04

标签: c++ namespaces

我已经习惯了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 ++中,这可能吗?更重要的是,这是处理此类任务的适当方式吗?

1 个答案:

答案 0 :(得分:5)

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

因此写

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