为什么要使用std::cout而不是简单地使用cout?

68

对于所有的 coutendl,我都收到这些错误消息:

main.cc:17:5: error: ‘cout’ was not declared in this scope
main.cc:17:5: note: suggested alternative:
/usr/include/c++/4.6/iostream:62:18: note:   ‘std::cout’

在遵循建议后,一切都很好。现在我很好奇,为什么我要那样做。我们以前在课程中使用C++,但在那些命令之前我从来没有必须写std::。这个系统可能有什么不同?


1
你必须声明你正在使用std,这样它才知道cout是什么。如果你将其作为导入进行,则可以直接使用cout,否则你必须完全证明它以告诉编译器cout实际上是什么。 - pengibot
47
恭喜你成为这个愚蠢的习惯的第一百万个受害者,这个习惯是导入每个我见过的C++入门课程都采用的std命名空间。 - Luc Touraille
1
抱歉,Luc,使用语言<x>进行编码并不仅限于那些参加有关该语言介绍课程的小群体。 - erikbstack
2
@erikb85 我想他的抱怨是针对那些参加过课程的人! - user146043
@LucTouraille 为什么使用命名空间std不好?! - Black
7
使用命名空间std并不是坏事,相反地,使用它是好的。但是,仅仅为了避免输入std::前缀而导入它所包含的所有名称(使用using namespace std指令),这样做是错误的,因为这违背了命名空间的本意。(参见这个FAQ)。我三年前的抱怨是针对那些在C++入门课程和示例中系统地这样做,并因此灌输C++学习者不良习惯。 - Luc Touraille
7个回答

133

你的课程可能使用的是早期标准之前的C++。一个简单的方法是查看旧程序并检查其中是否包含:

#include <iostream.h>
#include <iostream>

前者是预标准,只需使用cout而无需添加任何其他内容即可。您可以通过添加来在标准C ++中获得相同的行为

using std::cout;

或者

using namespace std;

只是一个想法,无论如何。


1
最完整和最易读的答案!我甚至遇到了<iostream.h>的问题! - erikbstack
15
请不要使用using namespace std;,例如参考https://dev59.com/D3M_5IYBdhLWcg3wQQ3w - Roi Danton

25

在C++标准中,cout被定义在std命名空间中,因此您需要使用std::cout或者使用

using namespace std;

但是,这并不总是这样,在过去,cout只存在于全局命名空间中(或者后来在全局和 std 中都存在)。因此,我可以得出结论,你的类使用的是旧版的 C++ 编译器。


12

标准模板库/输入输出流库中的所有内容都位于命名空间std中。可能您已经使用过:

using namespace std;

在你的类中,这就是为什么它起作用的原因。



3
您可能曾经在课堂上或代码中使用过using namespace std;。这个语句明确告诉预编译器在std中查找符号,这意味着您不需要使用std::。虽然最好的做法是每次都使用std::cout而不是cout,这样可以显式地调用std::cout。这样,如果您正在使用重新定义cout的其他库,则仍然具有std::cout行为,而不是其他自定义行为。

1

1
或许有点吹毛求疵:实际上,位于命名空间“std”中的不仅仅是STL(标准模板库)元素,还包括C++标准库元素。参考C++03:17.4.1.1/2:“除了宏、operator new和operator delete运算符之外,所有[C++标准]库实体都定义在命名空间std内或嵌套在命名空间std中的命名空间中。” - John Dibling

-4
如果您正在使用ROOT,甚至不需要编写#include<iostream>using namespace std;,只需从int filename()开始即可解决此问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接