我无法理解名称空间。 A.cpp:
#include <iostream>
namespace A { int pause = 8; }
int main() {
std::cout << A::pause << std::endl;
return 0;
}
并打印8
。但是,现在我添加using namespace A
并将A::pause
更改为pause
。 A.cpp:
#include <iostream>
namespace A { int pause = 8; }
using namespace A;
int main() {
std::cout << pause << std::endl;
return 0;
}
现在,我收到了编译错误:
A.cpp: In function ‘int main()’:
A.cpp:5: error: reference to ‘pause’ is ambiguous
/usr/include/unistd.h:507: error: candidates are: int pause()
A.cpp:2: error: int A::pause
A.cpp:5: error: reference to ‘pause’ is ambiguous
/usr/include/unistd.h:507: error: candidates are: int pause()
A.cpp:2: error: int A::pause
有人可以解释出了什么问题吗?我认为using namespace A
允许我省略A::
,类似于using namespace std
允许您省略std::
的方式。我尝试在main()
中移动该行,但是我得到了相同的错误消息。请注意,我故意选择变量名称pause
,因为它显然与pause()
中声明的iostream
冲突。任何反馈都表示赞赏。谢谢!
答案 0 :(得分:7)
编译器告诉你问题是什么。它有两个可能的路由来解析pause
- 一个是通过A::pause
,另一个是通过pause()
中定义的函数<unistd.h>
并存在于任何名称空间之外。编译器无法决定使用哪个,所以你必须帮助它。
如果您在A
命名空间内为变量选择了一个不太通用的名称,例如pause_val
,您可以在没有命名空间范围
#include <iostream>
namespace A { int pause_val = 8; }
using namespace A;
int main() {
std::cout << pause_val << std::endl;
return 0;
}
答案 1 :(得分:4)
因为有一个名为pause
的系统函数。如果您更仔细地检查错误消息,您将看到它也在系统标题<unistd.h>
中定义。
系统pause
函数位于全局命名空间中,当您执行using namespace A
时,您也会将A
命名空间中的符号拉入全局命名空间。所以现在你在全局命名空间中有两个名为pause
的符号,这就是编译器所抱怨的。
如果调用函数pause
,可能有效,因为只能调用函数而不是整数变量。但是,您也可以将函数用作变量(作为函数指针),从而导致此冲突。
答案 2 :(得分:3)
正如错误消息所示,在您添加using
语句后,全局命名空间中有多个名为pause
的内容。这就是为什么using namespace whatever;
在全球范围内是一个坏主意。
答案 3 :(得分:3)
有人可以解释出了什么问题吗?我认为使用命名空间A允许我省略A ::,类似于使用命名空间std如何允许你省略std ::
是的,确实如此,但是你有所有其他叫pause
的东西也在竞争竞争。
这就是为什么using namespace
不赞成的原因。