gpt4 book ai didi

c++ - 如何在命名空间中应用名称查找

转载 作者:行者123 更新时间:2023-11-30 04:04:55 27 4
gpt4 key购买 nike

我不明白为什么下面的代码会报错:

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 AB .然后调用前两个调用 B::f正如预期的那样,但是f(s)给出错误。我认为封闭范围内的名称默认情况下对内部范围可见,但显然我错了。然后我放置using namespace A和思想f(10.5)会调用A::f为了更好的类型匹配,以及 f(s) 的问题将得到解决,但事实并非如此(我的理解是 using 关键字将所有内容从正在使用的范围带到当前范围)。有人可以帮助我了解此处如何应用名称查找,在此先感谢。

注意我知道如何让它发挥作用。我想知道为什么会这样? C++ 标准用通俗易懂的语言对此进行了说明。为什么我的理解是错误的?

最佳答案

因为您没有调用 A::f(),所以会发生以下情况:

f(10.5); // cast to int
string s="Hi";
f(s); //I do not know any B::f(), with string argument.

更准确地说,在我粘贴的代码的第一行中,编译器将尝试调用 f(int a)。您传递 10.5 并且该函数等待一个整数。但是,10.5 可以转换为 int,方法是削减其十进制数字。此函数是 namespace B 中的一个函数。

[编辑]

默认的 namespace 是您在其中放置函数的空间。为了不使用默认值,您必须自己指定它,即 :: 运算符。

如果您删除 namespace B 中的 f(),则编译器将转到 namespace A,即 '外部'命名空间

也许这种与变量作用域的类比会有所帮助。

int main() {

int a = 10;

{
int a = 5;
std::cout << a << std::endl;
}

return 0;
}

输出为 5。当需要打印 a 时,编译器将去寻找最后声明的 a,除非我们另有说明。

关于c++ - 如何在命名空间中应用名称查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23582526/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com