到目前为止,我已经从很多不同的来源读过关于“cout / cin很模糊”的内容,并且我一直听到:
“使用'std ::'作为前缀,因为它可能会混淆你的编译器”
现在,我知道不使用范围运算符可能是一种不好的做法,并且通常会收到此类错误的人在编程中处于初级阶段。然而,消息来源说,我应该理解这是如何与时间一起工作的,不幸的是,我还没有。我偶尔也会收到错误(因为我尽管有所有警告,仍然使用“使用命名空间”声明),但我仍然不明白为什么它在99%或者情况下工作,而不是在另一种情况下工作。
我在Visual Studio Express(2012)中对我的代码进行了操作,当然,包含了所有必需的源代码(在本例中是iostream库),因此没有任何类型的永久性错误;它实际上往往是随机弹出(例如,我已经改变了一段代码,使错误出现,然后甚至在更改后,错误仍然存在)......真的,我没看到任何逻辑解释为什么错误出现在随机背景中 - 因此我要问:
导致此错误的原因是什么(它是什么意思,为什么以及 如何混淆处理器)?此外,是否值得跳过这些声明呢?不能以某种方式修复它吗?
事先谢谢!
答案 0 :(得分:1)
这就是你如何通过虔诚地using namespace ...
来混淆它。现在假设您正在使用的某个库定义了一个名为foo的函数。让我们假设它是提升或其他什么。甚至可能是你自己的名字命名为“op”。你有一个名为foo的函数。我的命名空间可能与您的名称空间具有相同的功能。如果导入两个名称空间,编译器将如何知道调用哪个?例如,见下文。
#include <cstdio>
namespace me
{
void foo()
{
printf("%s", "Calling me::foo\n");
}
}
namespace op
{
void foo()
{
printf("%s", "Calling op::foo\n");
}
}
using namespace me;
using namespace op;
int main()
{
foo(); //abiguous call.. Which foo is it going to use? op::foo? Or me::foo?
//now remove the using namespace me and using namespace op.. then try the below:
me::foo();
op::foo();
//The compiler now knows which foo you're trying to call and calls the correct one.
}