理解'using'关键字:C ++

时间:2013-06-26 16:46:08

标签: 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 namespace A;
    using namespace B;
    doSomethingWith(x);
    doSomethingWith(y);
    doSomethingWith(z);

    }

int main ()
{
sample();
return 0;
}

输出:

$ g++ -Wall TestCPP.cpp -o TestCPP
TestCPP.cpp: In function `void sample()':
TestCPP.cpp:26: error: `z' undeclared (first use this function)
TestCPP.cpp:26: error: (Each undeclared identifier is reported only once for each function it appears in.)

3 个答案:

答案 0 :(得分:4)

我有另一个错误:

  

错误:对'z'的引用不明确

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

doSomethingWith(A::z);

答案 1 :(得分:4)

using关键字用于

  1. 快捷名称,因此您无需输入std::cout

  2. 等内容
  3. 使用模板(c ++ 11)输入typedef,即template<typename T> using VT = std::vector<T>;

  4. 在您的情况下,namespace用于防止名称污染,这意味着两个函数/变量意外地共享相同的名称。如果您同时使用两个using,则会导致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编译器,但这是一个可预测的错误。

答案 2 :(得分:2)

您收到次优信息。一个更好的实现仍然会标记错误,但是说“z是模棱两可的”,因为这是问题而不是“未声明”。

在点名称z遇到多个事物:A :: z和B :: z,规则是实现不能只选择其中一个。您必须使用资格来解决问题。