问题描述
我正在学习使用指令,并试图了解使用指令的名称查找规则,但是我遇到了这个问题,找不到任何解释。
问题看起来像这样:
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 (将#修改为@)