我不明白为什么以下代码会出错:
namespace A
{
void f(double x){cout<<"A::f(double)\n";}
void f(string s){cout<<"A::f(string)\n";}
namespace B
{
using namespace A;
void f(int x){cout<<"B::f\n";}
void call()
{
f(10); // calls B::f, expected
f(10.5); // calls B::f, why??
string s="Hi";
f(s); // error, why??
}
}
}
我的理解是搜索一个名称,编译器从当前范围开始并不断搜索封闭范围,然后是全局范围,直到找到正确的(正确意味着签名匹配或在方法的情况下可转换)一个,或者如果不存在则给出错误。所以起初我尝试不使用using namespace A
in B
。B::f
然后按预期调用前两个调用,但f(s)
出现错误。我认为封闭范围内的名称默认情况下对内部范围可见,但显然我错了。然后我放置using namespace A
并认为f(10.5)
会要求A::f
更好的类型匹配,并且问题f(s)
将得到解决,但事实并非如此(我的理解是using
关键字将所有内容从正在使用的范围带到当前范围)。有人可以帮助我了解如何在此处应用名称查找,在此先感谢。
注意 我知道如何使它工作。我想知道为什么会这样?C++ 标准用易于理解的语言对此进行了说明。为什么我的理解是错误的?