如果不使用范围运算符,则无法访问C++命名空间变量

Bar*_*ney 2 c++ namespaces

我无法理解名称空间.A.cpp:

#include <iostream>
namespace A { int pause = 8; }
int main() {
    std::cout << A::pause << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它打印出来8.但是,现在我添加using namespace A并更改A::pause为just pause.A.cpp:

#include <iostream>
namespace A { int pause = 8; }
using namespace A;
int main() {
    std::cout << pause << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,我得到了编译错误:

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
Run Code Online (Sandbox Code Playgroud)

有人可以解释出了什么问题吗?我认为using namespace A允许我省略A::,类似于如何using namespace std允许你省略std::.我尝试移动该行,main()但我收到相同的错误消息.注意,我故意选择变量名称,pause因为它显然与pause()声明的in 冲突iostream.任何反馈都表示赞赏.谢谢!

sim*_*onc 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;
}
Run Code Online (Sandbox Code Playgroud)