有人可以解释下面的输出:
#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.)
答案 0 :(得分:4)
我有另一个错误:
错误:对'z'的引用不明确
对我来说非常清楚:z
存在于两个命名空间中,编译器不知道应该使用哪一个。 您知道吗?通过指定名称空间来解决它,例如:
doSomethingWith(A::z);
答案 1 :(得分:4)
using
关键字用于
快捷名称,因此您无需输入std::cout
使用模板(c ++ 11)输入typedef,即template<typename T> using VT = std::vector<T>;
在您的情况下,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,规则是实现不能只选择其中一个。您必须使用资格来解决问题。