使名称空间内联时,使用using-directive进行合格名称查找的不同行为

问题描述

我正在学习使用指令,并试图了解使用指令的名称查找规则,但是我遇到了这个问题,找不到任何解释。

问题看起来像这样:

prog1 :名称空间C在名称空间A之外:

#include <iostream>
namespace C
{
    namespace Detail
    {
        void func()
        {
            std::cout << "C::Detail::func " << "\n";
        }
    }
}

namespace A
{
    namespace Detail
    {
        void func()
        {
            std::cout << "A::Detail::func " << "\n";
        }
    }

    using namespace C;

    void func2()
    {
        Detail::func();  // no conflict,select A::Detail::func
    }
}

int main()
{
    A::func2();
    return 0;
}

程序成功执行并输出A::Detail::func

当我将namespace C移到namespace A内时,出现编译器错误:

prog2 :名称空间C在名称空间A内:

namespace A
{
    namespace C
    {
        namespace Detail
        {
            void func()
            {
                std::cout << "C::Detail::func " << "\n";
            }
        }
    }

    namespace Detail
    {
        void func()
        {
            std::cout << "A::Detail::func " << "\n";
        }
    }

    using namespace C;

    void func2()
    {
        Detail::func();    // conflict for A::Detail::func and A::C::Detail::func
    }
}

int main()
{
    A::func2();
    return 0;
}

程序出现以下编译器错误:

prog.cc:27:9: error: reference to 'Detail' is ambiguous
        Detail::func();
        ^
prog.cc:15:15: note: candidate found by name lookup is 'A::Detail'
    namespace Detail
              ^
prog.cc:6:19: note: candidate found by name lookup is 'A::C::Detail'
        namespace Detail
                  ^
1 error generated.

编译器:GCC 9.3.0和CLANG 9.0.0的结果相同。

我的问题:

为什么结果不同,在这种情况下,限定名称查找的具体规则是什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)