在同一函数中使用不同的命名空间
Using different namespace in same function
为什么当我在同一函数中使用两个不同的命名空间而不使用没有完全限定名称空间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;
}
相关文章:
- 在命名空间中定义函数还是限定函数
- CUDA内核和数学函数的显式命名空间
- 在命名空间中使用全局命名空间中的函数
- 是否可以将函数导入命名空间,但不能导出它?
- 使用另一个命名空间中的函数C++
- Visual Studio 无法解决类和命名空间中重载的明确函数
- 命名空间更改函数定义
- C++命名空间中调用 void 函数的错误
- C++ 17 个友元函数声明和内联命名空间
- MFC 函数来自 :: 命名空间?
- 使用类指针重载C++命名空间函数模板专用化替代方法?
- 在头文件中添加命名空间函数
- 命名空间函数的多重定义
- 在多个 cpp 文件中重用未命名的命名空间函数
- 如何正确声明命名空间函数
- 使用 libclang 解析命名空间函数
- C++命名空间函数
- 内联命名空间函数时出错
- 递归std::functional与递归匿名命名空间函数.使用哪一个
- 如何在命名空间函数中使用pragma weak