我正在尝试在以下代码中使用using指令访问变量x:
#include <iostream>
using namespace std;
int x = 10;
namespace e {
int x = 5;
}
int main() {
using namespace e; // Because of this line compiler shows error
cout << x;
return 0;
}
通常,我们使用以下行来访问x,但是我遇到了错误我们也可以使用e :: x; 但是我的问题是为什么我们不能使用命名空间e;
让我们从另一个例子开始。
const int x = 10;
namespace e {
const int y = 5;
}
int main()
{
std::cout << e::y;
using namespace e;
std::cout << y;
}
x
全局名称空间中有值10和名称的变量(可以简称为x
),名称y
空间中有值5的变量e
(必须称为e::y
)。
通过添加using namespace e;
,您可以将名称空间中的所有名称注入e
到全局名称空间中。这意味着全局名称空间现在包含namex
和y
,而名称空间e
包含name y
。现在,您可以5
同时使用y
和和来引用具有值的变量e::y
。
现在,回到您的示例。如果我们更改y
为x
:
const int x = 10;
namespace e {
const int x = 5;
}
int main()
{
std::cout << e::x;
using namespace e;
std::cout << x;
}
目前x
在全球命名空间和x
命名空间e
。通过添加,using namespace e;
您可以将所有名称从名称空间注入e
到全局名称空间,因此现在全局名称空间包含名称x
和x
,而名称空间e
包含name x
。看到问题了吗?全局名称空间包含两个名称x
,这会使编译器感到困惑。当您尝试在名称下打印变量时x
,编译器会在全局名称空间中查找名称并找到两个x
。它无法选择您的意思,因此会引发错误。
这就是为什么using namespace
(特别是using namespace std;
)被认为是邪恶的主要原因。通过更新库或引入新功能,可以轻松破坏工作代码。在这种情况下,编译器错误是最好的结果,但是有时编译器可能会默默地将一个函数替换为另一个函数,因为它匹配得更好。
您仍然可以使用完全限定的名称来访问两个变量:
int main()
{
using namespace e;
std::cout << ::x << " "; //x from global with fully quafilied name
std::cout << ::e::x << " "; //x from namespace e with fully qualified name
std::cout << e::x; //not fully qualified, but not ambiguous either - only one x in namespace e
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句