2012-06-08 1 views
50

я получаю эти сообщения об ошибках для всех cout и endl:Почему std :: cout вместо просто cout?

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 actuallt is – pengibot

+35

Поздравляем, вы являетесь 1000000-й жертвой глупой привычки импортировать пространство имен 'std', которое каждый вводный курс на C++, который я когда-либо видел, кажется, принимает ... –

+1

Извините, Luc, эта кодировка на языке не ограничена небольшой группой людей, которые слушали вступительные курсы об этом языке. – erikbwork

ответ

102

Возможно, ваш класс, возможно, использовал предварительный стандарт C++. Самый простой способ сказать, это посмотреть на ваши старые программы и проверьте, видите ли вы:

#include <iostream.h> 

или

#include <iostream> 

Бывший предварительно стандарт, и вы будете иметь возможность просто скажем cout, в отличие от std::cout без каких-либо дополнительных. Вы можете получить такое же поведение в стандартном C++, добавив

using std::cout; 

или

using namespace std; 

Только одна идея, во всяком случае.

+1

Самый полный и наиболее читаемый ответ! У меня даже была проблема ! – erikbwork

+2

Пожалуйста, не используйте 'using namespace std;', например. см. http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice –

12

Все в стандартной библиотеке шаблонов/Iostream находится в пространстве имен std. Вы, вероятно, использовали:

using namespace std; 

В ваших классах, и именно поэтому это сработало.

+13

Хотя 'cout' не является частью STL ... –

+0

@OliCharlesworth исправлено: D. – mfontanini

24

В стандарте C++, cout определяется в std пространстве имен, так что вы должны либо сказать std::cout или положить

using namespace std; 

в коде, чтобы получить на него.

Однако это не всегда так, и в прошлом cout был только в глобальном пространстве имен (или, позже, в глобальном и std). Поэтому я пришел к выводу, что ваши классы использовали более старый компилятор C++.

2

Возможно, у вас, вероятно, был using namespace std; в вашем коде, который вы делали в классе. Это явно указывает прекомпилеру искать символы в std, что означает, что вам не нужно std::. Хотя это хорошая практика: std::cout вместо cout, поэтому вы явно вызываете std::cout каждый раз. Таким образом, если вы используете другую библиотеку, которая переопределяет cout, у вас все еще есть поведение std::cout, а не какое-то другое поведение.

2

«std» - это пространство имен, используемое для STL (стандартная библиотека шаблонов). См. http://en.wikipedia.org/wiki/Namespace_(computer_science)#C.2B.2B

Вы можете либо написать «use namespace std;» перед использованием каких-либо функций stl, переменных или просто вставки «std ::» перед ними.

+0

Pedantic, возможно: это на самом деле элементы стандартной библиотеки C++, а не только STL, которые находятся в пространстве имен 'std'. Ссылка C++ 03: 17.4.1.1/2: «Все объекты библиотеки [C++ Standard], за исключением макросов, оператор new и оператор delete, определены в пределах пространства имен имен std или пространств имен, вложенных в пространство имен std." –

-2

, если работают в ROOT, вы не должны даже написать #include и использовать пространство имен станд; просто начните с int filename(). просто попробуйте.

+0

Это не дает ответа на вопрос. Когда у вас будет достаточно [репутации] (https://stackoverflow.com/help/whats-reputation), вы сможете [прокомментировать любое сообщение] (https://stackoverflow.com/help/privileges/comment); вместо этого [предоставить ответы, которые не требуют разъяснений у аськи) (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- я-делать-вместо этого). - [Из обзора] (/ review/low-quality-posts/17069531) –