【发布时间】:2021-02-10 11:34:53
【问题描述】:
我正在学习 using-directives,并试图了解 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,结果相同。
我的问题:
为什么结果不一样,这个场景下限定名查找的具体规则是什么?
【问题讨论】:
-
你使用哪个编译器?
-
我编辑了标题和问题,使其更加清晰。请让我知道这是否会以任何方式改变您问题的含义。此外,由于您要求特定规则,您可能会考虑将language-lawyer 标签添加到问题中。如果这样做,则需要删除其他标签之一。你可以删除它们中的任何一个,它们都同样适用,当然除了 c++ 标签:)。
标签: c++ namespaces language-lawyer name-lookup using-directives