命名与多个命名空间冲突

Naming conflict with multiple namespaces?

本文关键字:命名空间 冲突      更新时间:2023-10-16

我习惯了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中,如果我要编写一个包装器,我会这样做。假设我试图将阿尔忒弥斯框架移植到我的引擎中。如果我需要编写一个完整的包装器,它的名称将类似于MyEngine.Artemis包名称。

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

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

因此写入

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