2013-05-14 38 views
6

tôi cần triển khai một lớp số hỗ trợ toán tử < < cho đầu ra. tôi có một lỗi: "định danh 'ostream' là undefined" từ một số lý do dù cho tôi có cố gắng và cũngsố nhận dạng "ostream" là lỗi không xác định

đây các tập tin tiêu đề:

Number.h

#ifndef NUMBER_H 
#define NUMBER_H 
#include <iostream> 
class Number{ 
public: 
//an output method (for all type inheritance from number): 
virtual void show()=0; 

//an output operator: 
friend ostream& operator << (ostream &os, const Number &f); 


}; 

#endif 

lý do tại sao các trình biên dịch isnt nhận ra ostream trong chức năng của bạn bè?

+0

Vì với tất cả các loại và chức năng thư viện chuẩn, chỉ có * không có * 'ostream'. Chỉ có 'std :: ostream'. –

Trả lời

11

Bạn cần phải hội đủ điều kiện đầy đủ tên ostream với tên của namespace rằng lớp sống tại:

std::ostream 
// ^^^^^ 

Vì vậy, tuyên bố điều hành của bạn nên trở thành:

friend std::ostream& operator << (std::ostream &os, const Number &f); 
//  ^^^^^      ^^^^^ 

Ngoài ra, bạn có thể có một Khai báo using trước tên không đủ tiêu chuẩn ostream xuất hiện:

using std::ostream; 

Điều này sẽ cho phép bạn viết tên ostream mà không có đủ tiêu chuẩn, như trong phiên bản hiện tại của chương trình.

+0

cảm ơn rất nhiều! có thể sử dụng namespace std; sẽ hoạt động? –

+3

Mặc dù bạn không nên đặt 'using' trong không gian tên chung trong một tiêu đề, vì điều đó có thể gây ra xung đột tên cho những người dùng khác của tiêu đề. –

+1

@AviadChmelnik: Nó sẽ hoạt động, nhưng như Mike Seymour chỉ ra, nó được coi là một thực hành lập trình xấu, vì khả năng cao giới thiệu các xung đột tên (đặc biệt là khi đặt trong một tiêu đề tại phạm vi không gian tên toàn cầu). Thay vì chọn lọc nếu bạn có thể –

0

Câu trả lời của Andy Prowl là tuyệt vời nhưng hãy chống lại việc đặt "using std :: ostream" vào tiêu đề. Nếu bạn làm điều này thì các đơn vị biên dịch khác sử dụng tệp tiêu đề của bạn cũng sẽ có không gian tên này 'được sử dụng' theo mặc định và bạn có thể gặp phải các lỗi biên dịch khó chịu với các xung đột không gian tên.

+2

'using std :: ostream' đặt một tên vào không gian tên nơi nó được sử dụng:' ostream'. Đó là hư không gần như là một vấn đề lớn như 'sử dụng namespace std;', mà đặt ** mỗi ** tên từ 'std' vào không gian tên đó. –

+1

Các đơn vị biên dịch khác sẽ chỉ nhận tên 'ostream', không phải tên miền. Tuy nhiên, tôi đồng ý rằng đó là một ý tưởng tồi. – juanchopanza

Các vấn đề liên quan