为什么我在同一个函数中使用两个不同的命名空间而没有完全限定名称空间时使用myCout()
指令时收到错误消息(错误:调用重载using namespace
是不明确的)?
#include <iostream>
using namespace std;
namespace first
{
void myCout(void)
{
cout<<"Hello World is great\n";
}
}
namespace second
{
void myCout(void)
{
cout<<"Hello Sky is high\n";
}
}
int main(void)
{
cout<<"Hello World\n";
using namespace first;
myCout();
using namespace second;
myCout();
return(0);
}
如果我在第二个命名空间中使用myCout()
的完全限定名称空间,如下所示,则没有问题
int main(void)
{
cout<<"Hello World\n";
using namespace first;
myCout();
second::myCout();
return(0);
}
答案 0 :(得分:5)
using
指令尊重范围。因此,您可以引入一个新的块作用域来限制每个符号引入的符号的可用性:
int main(void)
{
cout<<"Hello World\n";
{
using namespace first;
myCout();
}
{
using namespace second;
myCout();
}
return(0);
}
通常情况下,为避免冲突和深度嵌套,请尝试使用using
声明仅提供所需的标识符。例如,如果您只想使用foo
中的课程first
,则以下内容不会产生任何歧义:
using first::foo;
using namespace second;
答案 1 :(得分:3)
using namespace ...
指令不会创建有序路径;它们也不会覆盖以前的所有。所以,是的,你的代码会产生一种模糊的情况。
答案 2 :(得分:1)
首先使用,因此引入了第一个命名空间的
namespace first
。然后你使用myCout
,导致其他namespace second
也发挥作用。第二个命名空间不覆盖以前的命名空间。
因此,当您第二次调用myCout
时,会有两个定义在起作用,导致编译器将此规则定义为不明确的调用。
换句话说:
myCout