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

时间:2013-02-07 13:54:18

标签: c++ namespaces

我无法理解名称空间。 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冲突。任何反馈都表示赞赏。谢谢!

4 个答案:

答案 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不赞成的原因。