2

我无法理解命名空间。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为 just 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,因为它显然与 in 中pause()声明的冲突iostream。任何反馈表示赞赏。谢谢!

4

4 回答 4

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;
}
于 2013-02-07T13:56:36.050 回答
4

因为有一个名为的系统函数pause。如果您更仔细地检查错误消息,您会看到它也在 system header 中定义<unistd.h>

系统pause函数位于全局命名空间中,当您这样做时,您也将命名空间using namespace A中的符号拉A入全局命名空间。所以现在你pause在全局命名空间中有两个符号,这是编译器抱怨的。

如果您调用 function ,它可能会起作用pause,因为只能调用函数而不是整数变量。但是,您也可以将函数用作变量(作为函数指针),这会导致这种冲突。

于 2013-02-07T13:56:56.133 回答
3

正如错误消息所说,在您添加using语句后,全局命名空间中命名的内容不止一个。pause这就是为什么using namespace whatever;在全球范围内是一个坏主意。

于 2013-02-07T13:57:13.947 回答
3

有人可以解释出了什么问题吗?我认为使用命名空间 A 允许我省略 A::,类似于使用命名空间 std 允许你省略 std::

是的,确实如此,但是你也有所有其他的东西叫做pause竞争竞争。

这就是为什么using namespace经常不受欢迎的原因。

于 2013-02-07T14:06:18.443 回答