2012-06-08 56 views
50

tôi nhận được các thông báo lỗi cho tất cả coutendl:Tại sao std :: cout thay vì chỉ đơn giản là 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’ 

Sau khi làm theo các gợi ý, mọi thứ đều tốt. Bây giờ tôi tò mò, tại sao tôi phải làm điều đó. Chúng tôi đã sử dụng C++ trong các lớp học trước đây, nhưng tôi không bao giờ phải viết một std:: trước bất kỳ lệnh nào trong số đó. Điều gì có thể khác trên hệ thống này?

+1

bạn phải nói rằng bạn đang sử dụng std cho nó để biết cout là gì. nếu bạn làm điều này như là một nhập khẩu, bạn có thể chỉ cần nói cout, nếu không bạn phải hoàn toàn biện minh cho nó để nói cho trình biên dịch những gì cout actuallt là – pengibot

+35

Xin chúc mừng, bạn là nạn nhân thứ 1000000 của thói quen ngu ngốc của việc nhập khẩu không gian tên 'std' giới thiệu khóa học để C + + tôi đã từng nhìn thấy dường như thông qua ... –

+1

Xin lỗi Luc, mã hóa trong ngôn ngữ không giới hạn nhóm nhỏ những người đang nghe các khóa học giới thiệu về ngôn ngữ đó. – erikbwork

Trả lời

102

Có vẻ như lớp học của bạn có thể đã sử dụng C++ chuẩn trước. Một cách dễ dàng để nói, là nhìn vào các chương trình cũ của bạn và kiểm tra, bạn có thấy:

#include <iostream.h> 

hoặc

#include <iostream> 

Điều thứ nhất là trước tiêu chuẩn, và bạn sẽ có thể chỉ nói cout như trái ngược với std::cout mà không cần thêm bất kỳ điều gì. Bạn có thể nhận hành vi tương tự trong tiêu chuẩn C++ bằng cách thêm

using std::cout; 

hoặc

using namespace std; 

Chỉ cần một ý tưởng, dù sao.

+1

Câu trả lời hoàn chỉnh nhất và dễ đọc nhất! Tôi thậm chí còn gặp vấn đề ! – erikbwork

+2

Vui lòng không sử dụng 'using namespace std;', ví dụ: xem http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice –

12

Mọi thứ trong Mẫu chuẩn/Thư viện Iostream nằm trong không gian tên std. Bạn có thể đã sử dụng:

using namespace std; 

Trong lớp học của bạn, và đó là lý do tại sao nó hoạt động.

+13

Mặc dù 'cout' không phải là một phần của STL ... –

+0

@OliCharlesworth đã sửa: D. – mfontanini

24

Trong tiêu chuẩn C++, cout được định nghĩa trong namespace std, vì vậy bạn cần phải hoặc là nói std::cout hoặc đặt

using namespace std; 

trong mã của bạn để có được vào nó.

Tuy nhiên, đây không phải lúc nào cũng như vậy, và trong quá khứ cout chỉ nằm trong không gian tên chung (hoặc, sau này, trong toàn cầu và std). Do đó, tôi sẽ kết luận rằng các lớp của bạn đã sử dụng trình biên dịch C++ cũ hơn.

2

Có thể bạn đã có using namespace std; trước đó trong mã bạn đã làm trong lớp học. Điều đó nói rõ ràng với trình biên dịch trước để tìm kiếm các ký hiệu trong std, có nghĩa là bạn không cần phải std::. Mặc dù thực hành tốt là std::cout thay vì cout vì vậy bạn gọi một cách rõ ràng std::cout mỗi lần. Bằng cách đó nếu bạn đang sử dụng thư viện khác xác định lại cout, bạn vẫn có hành vi std::cout thay vì một số hành vi tùy chỉnh khác.

2

"std" là vùng tên được sử dụng cho STL (Thư viện mẫu chuẩn). Vui lòng tham khảo http://en.wikipedia.org/wiki/Namespace_(computer_science)#C.2B.2B

Bạn có thể viết "sử dụng không gian tên std;" trước khi sử dụng bất kỳ chức năng stl, biến hoặc chỉ inser "std ::" trước khi chúng.

+0

Pedantic, có lẽ: Đó thực sự là các thành phần của Thư viện chuẩn C++, không chỉ là STL, có trong không gian tên 'std'. Tham khảo C++ 03: 17.4.1.1/2: "Tất cả các thực thể thư viện [C++ Standard] trừ macro, toán tử mới và toán tử được xác định trong các không gian tên không gian tên được lồng trong không gian tên std." –

-2

nếu đang làm việc trong ROOT, bạn thậm chí không phải viết #include using namespace và std; chỉ cần bắt đầu từ tên tệp int(). chỉ cần thử.

+0

Điều này không cung cấp câu trả lời cho câu hỏi. Khi bạn có đủ [danh tiếng] (https://stackoverflow.com/help/whats-reputation), bạn sẽ có thể [nhận xét về bất kỳ bài đăng nào] (https://stackoverflow.com/help/privileges/comment); thay vào đó, [cung cấp câu trả lời không yêu cầu làm rõ từ người hỏi] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-thay thế). - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/17069531) –