在同一函数中使用不同的命名空间

Using different namespace in same function

本文关键字:命名空间 函数      更新时间:2023-10-16

为什么当我在同一函数中使用两个不同的命名空间而不使用没有完全限定名称空间using namespace指令时,我会收到错误消息(错误:重载myCout()的调用是不明确的(?

#include <iostream>
using namespace std;
namespace first
{
void myCout(void)
{
cout<<"Hello World is greatn";
}
}
namespace second
{
void myCout(void)
{
cout<<"Hello Sky is highn";
}
}
int main(void)
{
cout<<"Hello Worldn";
using namespace first;
myCout();
using namespace second;
myCout();
return(0);
}

如果我使用完全限定的命名空间在第二个命名空间中myCout(),如下所示,则没有问题

int main(void)
{
cout<<"Hello Worldn";
using namespace first;
myCout();
second::myCout();
return(0);
}

using指令尊重作用域。因此,您可以引入一个新的块范围来限制每个块范围引入的符号的可用性:

int main(void)
{
cout<<"Hello Worldn";
{
using namespace first;
myCout();
}
{
using namespace second;
myCout();
}
return(0);
}

通常,为了避免冲突和深度嵌套,请尝试使用using声明仅拉入所需的标识符。例如,如果您只想使用first中的类foo,那么以下内容就不会有歧义:

using first::foo;
using namespace second;

using namespace ...指令不会创建有序路径;也不会覆盖所有以前的路径。所以,是的,你的代码创造了一个模棱两可的情况。

首先使用namespace first,因此引入了第一个命名空间的myCout。然后你使用namespace second,导致其他myCout也发挥作用。第二个命名空间不会覆盖上一个命名空间。

因此,当您第二次调用myCout时,有两个定义在起作用,导致编译器将其规则为不明确的调用。

换句话说:

int main(void)
{
using namespace first;  // `myCout` of the 1st namespace is introduced
myCout();
using namespace second; // `myCout` of the 2nd namespace is introduced
// and does not override the first namespace!
myCout();               // Which `myCout`? Of the first or second?
return 0;
}