C++ 在同一函数中使用不同的命名空间
当我在同一个函数中使用C++ 在同一函数中使用不同的命名空间,c++,function,oop,namespaces,C++,Function,Oop,Namespaces,当我在同一个函数中使用usingnamespace指令而没有完全限定的名称空间时,为什么会收到错误消息(错误:重载的myCout()调用不明确) #include <iostream> using namespace std; namespace first { void myCout(void) { cout<<"Hello World is great\n"; } } namespace second { voi
usingnamespace
指令而没有完全限定的名称空间时,为什么会收到错误消息(错误:重载的myCout()
调用不明确)
#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
。然后使用namespace second
,使另一个myout
也起作用。第二个命名空间不覆盖前一个命名空间
因此,当您第二次调用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;
}
使用指令尊重范围。因此,您可以引入新的块范围,以限制每个块引入的符号的可用性:
int main(void)
{
cout<<"Hello World\n";
{
using namespace first;
myCout();
}
{
using namespace second;
myCout();
}
return(0);
}
在您使用命名空间第二次执行之后
,在main
的范围内有两个具有相同签名的myout
定义,因此-调用不明确。
int main(void)
{
cout<<"Hello World\n";
{
using namespace first;
myCout();
}
{
using namespace second;
myCout();
}
return(0);
}
using first::foo;
using namespace second;