2012-06-08 16 views
50

ottengo questi messaggi di errore per tutti cout e endl:Perché std :: cout invece di semplicemente 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’ 

Dopo aver seguito il suggerimento, è tutto a posto. Ora sono curioso, perché dovevo farlo. Abbiamo usato C++ in classi prima, ma non ho mai dovuto scrivere un std:: prima di uno qualsiasi di questi comandi. Cosa potrebbe essere diverso su questo sistema?

+1

devi dire che stai usando std per sapere cosa è cout. se lo fai come importazione puoi semplicemente dire cout, altrimenti devi assolutamente giustificarlo per dire al compilatore cosa è cout actuall – pengibot

+35

Congratulazioni, sei la 1000000 vittima dell'abitudine stupida di importare il namespace 'std' che ogni singolo Il corso introduttivo al C++ che abbia mai visto sembra adottare ... –

+1

Scusate Luc, quella codifica in lingua non è limitata al piccolo gruppo di persone che stavano ascoltando corsi introduttivi su quella lingua. – erikbwork

risposta

102

Sembra possibile che la classe abbia utilizzato C++ pre-standard. Un modo semplice per dire, è quello di guardare i vecchi programmi e verificare, vedi:

#include <iostream.h> 

o

#include <iostream> 

Il primo è pre-standard, e sarete in grado di appena dite cout in contrasto con std::cout senza aggiungere altro. È possibile ottenere lo stesso comportamento in C++ standard con l'aggiunta di

using std::cout; 

o

using namespace std; 

una sola idea, in ogni caso.

+1

La risposta più completa e più leggibile! Ho avuto anche il problema ! – erikbwork

+2

Si prega di non usare 'using namespace std;', ad es. vedi http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice –

12

Tutto nel modello standard/Iostream Library risiede nello spazio dei nomi std. Probabilmente hai usato:

using namespace std; 

Nelle tue classi, ed è per questo che ha funzionato.

+13

Anche se 'cout' non fa parte dell'STL ... –

+0

@OliCharlesworth corretto: D. – mfontanini

24

Nello standard C++, cout è definita nel std spazio dei nomi, quindi è necessario o dire std::cout o mettere

using namespace std; 

nel codice al fine di ottenere a questo.

Tuttavia, questo non è sempre stato il caso e in passato cout era solo nello spazio dei nomi globale (o, più avanti, in entrambi globale e std). Quindi concluderei che le tue classi usavano un vecchio compilatore C++.

2

Probabilmente hai avuto using namespace std; prima nel tuo codice che hai fatto in classe. Questo dice esplicitamente al precompilatore di cercare i simboli in std, il che significa che non è necessario std::. Sebbene sia una buona pratica per std::cout invece di cout, si invoca esplicitamente std::cout ogni volta. In questo modo se si utilizza un'altra libreria che ridefinisce cout, si ha ancora il comportamento std::cout anziché un altro comportamento personalizzato.

2

"std" è uno spazio dei nomi utilizzato per STL (Standard Template Library). Si prega di fare riferimento a http://en.wikipedia.org/wiki/Namespace_(computer_science)#C.2B.2B

È possibile scrivere "use namespace std;" prima di usare qualsiasi funzione, variabile o semplicemente inserire "std ::" prima di loro.

+0

Pedantic, forse: in realtà sono gli elementi della libreria standard C++, non solo gli STL, che sono nello spazio dei nomi 'std'. Riferimento C++ 03: 17.4.1.1/2: "Tutte le entità della libreria [Standard C++] tranne le macro, l'operatore new e l'eliminazione dell'operatore sono definite all'interno dello spazio dei nomi std o degli spazi dei nomi nidificati nello std del namespace." –

-2

se stanno lavorando in ROOT, che non hanno nemmeno bisogno di scrivere # include e utilizzando namespace std; avvia semplicemente da nomefile int(). provalo.

+0

Questo non fornisce una risposta alla domanda. Una volta che hai [reputazione] sufficiente (https://stackoverflow.com/help/whats-reputation) sarai in grado di [commentare qualsiasi post] (https://stackoverflow.com/help/privileges/comment); invece [fornisci risposte che non richiedono chiarimenti da parte del richiedente] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-, invece). - [Dalla recensione] (/ recensione/post di bassa qualità/17069531) –