2012-06-08 17 views
50

uzyskać te komunikaty o błędach dla wszystkich cout i endl:Dlaczego std :: cout zamiast po prostu 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’ 

Po wykonaniu sugestię, wszystko jest w porządku. Teraz jestem ciekawy, dlaczego musiałem to zrobić. Użyliśmy C++ w klasach przed, ale nigdy nie musiałem napisać std:: przed żadnym z tych poleceń. Co może być innego w tym systemie?

+1

musisz powiedzieć, że używasz std, aby wiedzieć, co to jest cout. jeśli robisz to jako import, możesz po prostu powiedzieć cout, w przeciwnym razie musisz go w pełni uzasadnić, aby powiedzieć kompilatorowi, co to jest Actallallt. – pengibot

+35

Gratulacje, jesteś 1000000 ofiarą głupiego zwyczaju importowania przestrzeni nazw 'std' kurs wprowadzający do C++, jaki kiedykolwiek widziałem, wydaje się przyjmować ... –

+1

Przykro nam, Luc, że kodowanie w języku nie jest ograniczone do małej grupy ludzi, którzy słuchali kursów wprowadzających na temat tego języka. – erikbwork

Odpowiedz

102

Wygląda na to, że Twoja klasa mogła używać standardowego C++. Łatwym sposobem, aby powiedzieć, jest spojrzenie na swoich starych programów i sprawdzić, czy widzisz:

#include <iostream.h> 

lub

#include <iostream> 

Były to pre-standard, a będziesz w stanie po prostu powiedzieć cout w przeciwieństwie do std::cout bez niczego dodatkowego. Można uzyskać takie samo zachowanie w standardowej C++ dodając

using std::cout; 

lub

using namespace std; 

tylko jeden pomysł, tak.

+1

Najbardziej kompletna i najbardziej czytelna odpowiedź! Miałem nawet problem z ! – erikbwork

+2

Proszę nie używać 'using namespace std;', np. zobacz http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice –

12

Wszystko w standardowym szablonie/bibliotece Iostream znajduje się w standardowej przestrzeni nazw. Prawdopodobnie użyłeś:

using namespace std; 

W twoich zajęciach, i dlatego zadziałało.

+13

Chociaż 'cout' nie jest częścią STL ... –

+0

@OliCharlesworth naprawiono: D. – mfontanini

24

W standardzie C++, cout jest zdefiniowane w przestrzeni nazw std, więc trzeba albo powiedzieć std::cout lub umieścić

using namespace std; 

w kodzie w celu uzyskania na to.

Jednak nie zawsze tak było, aw przeszłości cout znajdował się tylko w globalnej przestrzeni nazw (lub później w wersji globalnej i std). Wnioskuję zatem, że twoje klasy używały starszego kompilatora C++.

2

Najprawdopodobniej miałeś using namespace std; w swoim kodzie, który zrobiłeś w klasie. To wyraźnie mówi prekompilatorowi, aby szukał symboli w std, co oznacza, że ​​nie musisz std::. Chociaż dobrą praktyką jest std::cout zamiast cout, więc za każdym razem jawnie wywoływane jest std::cout. W ten sposób, jeśli używasz innej biblioteki, która przedefiniowuje cout, nadal zachowujesz zachowanie std::cout zamiast jakiegoś innego niestandardowego zachowania.

2

"std" to przestrzeń nazw używana dla STL (Standard Template Library). Proszę zapoznać się z http://en.wikipedia.org/wiki/Namespace_(computer_science)#C.2B.2B

Możesz napisać "use namespace std;" przed użyciem jakichkolwiek funkcji, zmiennych lub po prostu wstaw "std ::" przed nimi.

+0

Pedantyczny, być może: To w rzeczywistości elementy biblioteki standardowej C++, a nie tylko STL, które znajdują się w przestrzeni nazw 'std'. Odniesienie C++ 03: 17.4.1.1/2: "Wszystkie jednostki biblioteczne [C++ Standard] z wyjątkiem makr, operator new i operator delete są zdefiniowane w przestrzeni nazw std nazw lub przestrzeni nazw zagnieżdżonych w przestrzeni nazw standardowej." –

-2

jeśli pracują w korzeń, nawet nie trzeba pisać i #include using namespace std; po prostu zacznij od int filename(). po prostu spróbuj.

+0

Nie zapewnia to odpowiedzi na pytanie. Gdy masz już wystarczającą [reputację] (https://stackoverflow.com/help/whats-reputation), będziesz mógł [komentować dowolny wpis] (https://stackoverflow.com/help/privileges/comment); zamiast tego [dostarczaj odpowiedzi, które nie wymagają wyjaśnień od pytającego] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-zamiast). - [Z recenzji] (/ opinia/niskiej jakości-posts/17069531) –