正在使用命名空间范围
Using namespace scope
我尝试了以下代码。当我编译时,我得到了一个错误,即first_var存在不明确的实例,而我引入了在最后一个cout 之前使用命名空间second_space
我想这是因为最后一个cout同时使用了这两个名称空间。命名空间没有重写概念?是否有命名空间作用域可以结束,或者从使用命名空间点继续到文件结束?
#include<iostream.h>
namespace first_space{
int first_var;
}
namespace second_space{
int first_var = 1;
}
int main()
{
cout<<"Hello World"<<endl;
cout<<"First Namespace Variable using namespace identifier:"<<first_space::first_var<<endl;
using namespace first_space;
cout<<"First Namespace Variable using using identifier:"<<first_var<<endl;
using namespace second_space;
cout<<"Second Namespace Variable using using identifier:"<<first_var<<endl;
}
编辑1:
我试过下面这样的东西。在main中声明了一个名称相同的变量,为其分配了一个值1,然后使用下面的命名空间使用。但我看到了,在最后两个cout中,first_var的值被打印为1。这里没有歧义。所以名称空间没有任何效果?为什么会这样?
#include<iostream.h>
namespace first_space{
int first_var;
}
namespace second_space{
int first_var = 1;
}
int main()
{
int first_var =1 ;
using namespace first_space;
cout<<"Hello World"<<endl;
cout<<"First Namespace Variable using namespace identifier:"<<first_space::first_var<<endl;
cout<<"First Namespace Variable using using identifier:"<<first_var<<endl;
// using namespace second_space;
cout<<"Second Namespace Variable using using identifier:"<<first_var<<endl;
}
输出:
Hello World
First Namespace Variable using namespace identifier:0
First Namespace Variable using using identifier:1
Second Namespace Variable using using identifier:1
是的,您是正确的,在第二个using
语句之后,变量first_var
现在是不明确的,因为这两个名称空间都是有效的,并且在名称查找方面具有相同的优先级。
两种解决方法是
a) 添加大括号以强制执行匿名范围(实时演示)
{
using namespace first_space;
cout << "First Namespace Variable using using identifier:" << first_var << endl;
}
{
using namespace second_space;
cout << "Second Namespace Variable using using identifier:" << first_var << endl;
}
b) 删除using
关键字并直接使用名称空间范围
cout << "First Namespace Variable using using identifier:" << first_space::first_var << endl;
cout << "Second Namespace Variable using using identifier:" << second_space::first_var << endl;
就我个人而言,我会选择选项b。首先添加名称空间的主要原因之一是为了避免歧义问题,因此用一堆using
语句污染当前范围会破坏这一点。
相关文章:
- 命名空间范围内的外部 - GCC vs clang vs msvc
- 具有命名空间范围的名称的 C++ 内部链接
- GCC 和非命名空间范围内的显式专用化
- 是否将命名空间范围文件本地 (.cpp) 常量放在匿名命名空间中
- Visual C:命名空间范围错误或晦涩功能?
- 命名空间范围问题
- 无法在命名空间范围内分配变量
- 非命名空间范围内的显式专用化不会在 GCC 中编译
- 如何处理警告 C4177:#pragma 'float_control' 只能在全局范围或命名空间范围内使用
- 为什么类型特征不适用于命名空间范围内的类型?
- 强制标准名称空间的命名空间范围
- 为什么我应该使用extern关键字来声明命名空间范围中的变量
- 关于友元函数定义和命名空间范围
- BOOST_STATIC_ASSERT的命名空间范围
- 为什么命名空间中的某些函数可以在没有命名空间范围前缀的情况下访问
- 在 cpp 文件中命名空间范围内"Private"变量
- 正在使用命名空间范围
- 强制名称查找以考虑命名空间范围
- 为什么语句不能出现在命名空间范围内
- 为什么不允许将类成员定义的' static '关键字放在命名空间范围内?