gpt4 book ai didi

c++ - 命名空间和范围可见性问题

转载 作者:行者123 更新时间:2023-11-28 03:48:17 27 4
gpt4 key购买 nike

我用下面的代码制作了一个头文件sampleheader.h:

namespace sample_namespace
{
int add(int n1,int n2)
{
return (n1 + n2);
}
}

现在我的 main.cpp 文件是:

#include <iostream>
#include "sampleheader.h"
using namespace std;

int add(int n1, int n2)
{
return (n1 + n2);
}

int main(void)
{
using namespace sample_namespace;
//cout<<add(5,7);
}

如果我将该行注释掉,项目构建时不会出现任何警告。这是可以理解的,因为局部 add() 函数是在全局范围内定义的,而 add() 函数在 main() 的范围内可见。因此不会发生名称冲突。

但是,如果我删除评论,我会收到以下错误:

“对重载函数的模糊调用”

首先,正如我上面所解释的(如果我是对的),根本不应该存在名称冲突。但是,如果存在名称冲突,为什么只有在我调用该函数时编译器才会通知它。一旦名称发生冲突(如果有的话),应立即显示此类错误。

感谢任何帮助。

最佳答案

好吧,你自己解释了。

当范围内同时有 int add()int sample_namespace::add() 时,调用是不明确的。 add() 语句可能表示其中任何一个。

并存的函数没有冲突,一个是int add(),另一个是int sample_namespace::add()。这就是命名空间的全部目的

在编写使用它们的代码时,您只需要清楚即可。如果您摆脱 using namespace 指令并始终编写显式代码,那么您就不会遇到问题:

#include <iostream>

namespace sample_namespace {
int add(int n1, int n2) {
return (n1 + n2);
}
}

int add(int n1, int n2) {
return (n1 + n2);
}

int main() {
std::cout << sample_namespace::add(5,7);
}

(此外,在 header 中定义非内联函数是一个坏主意™。)

关于c++ - 命名空间和范围可见性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6664850/

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