我对C ++中的命名空间有一个简单的问题。编译下面的一小段代码时出错。我不明白为什么。感谢您提前提供任何帮助!
#include <iostream>
using namespace std;
int x=100;
namespace first
{
int x=1;
}
namespace second
{
int x=2;
}
int main(){
{
using namespace first;
cout<<x<<endl;
}
{
using namespace second;
cout<<x<<endl;
}
cout<<x<<endl;
}
如果我注释掉在全局范围和最后一个语句中声明的x。它工作正常。但在我看来,第一个x在std命名空间中声明,并且在声明它们的代码块之后,在main中使用命名空间first和second将是无效的(因此命名空间将再次为std)。所以上面的代码应该可行。我哪里错了?
答案 0 :(得分:3)
但在我看来,第一个x是在std命名空间中声明的
你的思想错了。 using namespace std
使std
中的名称在全局命名空间中可用,并不意味着在全局命名空间中声明的名称在std
中。
x
在全局命名空间中声明。
所以命名空间将再次被标准化
不,您的文件中没有任何内容位于命名空间std
中,只有<iostream>
的内容位于命名空间std
中。
错误是当您尝试使用x
时,您可能会引用范围::x
和first::x
中的两个不同变量,因此它不明确。您可以使用using声明而不是using指令来消除歧义:
{
using first::x;
cout<<x<<endl;
}
这表示该范围x
指的是first::x
答案 1 :(得分:2)
在这种情况下,x变量是不明确的。编译器无法找到您要使用的x。你可以写这样的。
#include <iostream>
using namespace std;
int x=100;
namespace first
{
int x=1;
}
namespace second
{
int x=2;
}
int main(){
{
cout<<first::x<<endl;
}
{
cout<<second::x<<endl;
}
cout<<x<<endl;
}
现在你的代码将被编译。
答案 2 :(得分:0)
第一个x不在std命名空间中。如果像这样定义,它只会在std命名空间中:
namespace std
{
int x;
}
因为它不在该命名空间中,所以它在程序中稍后与x的引用相匹配,并且当另一个声明x的命名空间也被使用时(例如在使用命名空间的第一个/第二个)中,这样的引用变得不明确。