c ++中的名称空间有效性

时间:2014-03-13 11:43:26

标签: c++ namespaces

我对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)。所以上面的代码应该可行。我哪里错了?

3 个答案:

答案 0 :(得分:3)

  

但在我看来,第一个x是在std命名空间中声明的

你的思想错了。 using namespace std使std中的名称在全局命名空间中可用,并不意味着在全局命名空间中声明的名称在std中。

x在全局命名空间中声明。

  

所以命名空间将再次被标准化

不,您的文件中没有任何内容位于命名空间std中,只有<iostream>的内容位于命名空间std中。

错误是当您尝试使用x时,您可能会引用范围::xfirst::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的命名空间也被使用时(例如在使用命名空间的第一个/第二个)中,这样的引用变得不明确。