C++ 理解';使用';关键词:C++;

C++ 理解';使用';关键词:C++;,c++,namespaces,C++,Namespaces,有人能解释一下吗 #include <iostream> using namespace std; namespace A{ int x=1; int z=2; } namespace B{ int y=3; int z=4; } void doSomethingWith(int i) throw() { cout << i ; } void sample() throw() { using

有人能解释一下吗

#include <iostream>

using namespace std;

namespace A{
    int x=1;
    int z=2;
    }

namespace B{
    int y=3;
    int z=4;
    }

void doSomethingWith(int i) throw()
{
    cout << i ;
    }

void sample() throw()
{
    using namespace A;
    using namespace B;
    doSomethingWith(x);
    doSomethingWith(y);
    doSomethingWith(z);

    }

int main ()
{
sample();
return 0;
}
我还有一个错误:

错误:对“z”的引用不明确

这对我来说非常清楚:
z
存在于两个名称空间中,编译器不知道应该使用哪一个您知道吗?通过指定名称空间来解决此问题,例如:

doSomethingWith(A::z);

你得到了一个次优的信息。更好的实现仍然会标记错误,但是说“z是不明确的”,因为这是问题所在,而不是“未声明的”


在名称z命中多个对象时:A::z和B::z,规则是实现不能只选择其中一个。您必须使用限定来解决问题。

使用
关键字用于

  • 设置名称的快捷方式,这样您就不需要键入类似于
    std::cout

  • 使用模板(c++11)键入def,即使用VT=std::vector的
    模板

  • 在您的情况下,
    名称空间
    用于防止名称污染,这意味着两个函数/变量意外地共享了相同的名称。如果将这两个
    一起使用
    ,则会导致模糊的
    z
    。我的g++4.8.1报告了错误:

    abc.cpp: In function ‘void sample()’:
    abc.cpp:26:21: error: reference to ‘z’ is ambiguous
         doSomethingWith(z);
                         ^
    abc.cpp:12:5: note: candidates are: int B::z
     int z=4;
         ^
    abc.cpp:7:5: note:                 int A::z
     int z=2;
         ^
    

    这是意料之中的。我不确定您使用的是哪种gnu编译器,但这是一个可预测的错误。

    您希望发生什么?该错误具有误导性。我认为发布的代码不是您编译并给出发布错误的代码。@很快感谢您更正使用关键字。我不小心写错了。AFAIU使用
    的“typedef版本”也可以在没有模板的情况下使用,例如
    使用integer=int
    abc.cpp: In function ‘void sample()’:
    abc.cpp:26:21: error: reference to ‘z’ is ambiguous
         doSomethingWith(z);
                         ^
    abc.cpp:12:5: note: candidates are: int B::z
     int z=4;
         ^
    abc.cpp:7:5: note:                 int A::z
     int z=2;
         ^