2013-05-14 9 views
6

मुझे आउटपुट के लिए ऑपरेटर < < का समर्थन करने वाले नंबर क्लास को लागू करने की आवश्यकता है। "पहचानकर्ता" ostream किसी कारण से "अपरिभाषित है" eventhough मैं शामिल है और यह भी हेडर फाइल कोशिशपहचानकर्ता "ostream" त्रुटि को परिभाषित नहीं किया गया है

यहाँ

: मैं एक त्रुटि है

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 

क्यों संकलक नहीं है मित्र समारोह में ostream पहचानते हैं?

+0

क्योंकि सभी मानक लाइब्रेरी प्रकारों और कार्यों के साथ, बस * नहीं * 'ostream' है। केवल 'std :: ostream' है। –

उत्तर

11

आप पूरी तरह से नाम स्थान उस वर्ग में रहती है के नाम के साथ नाम ostream अर्हता प्राप्त करने की जरूरत है:

std::ostream 
// ^^^^^ 

तो अपने ऑपरेटर घोषणा हो जाना चाहिए:

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

वैकल्पिक रूप से, आप एक हो सकता था अयोग्य नाम ostream से पहले using घोषणा प्रकट होता है:

using std::ostream; 

यह आपको प्रोग्राम के वर्तमान संस्करण के रूप में, पूर्ण योग्यता के बिना ostream नाम लिखने की अनुमति देगा।

+0

बहुत बहुत धन्यवाद! नामस्थान std का उपयोग कर सकते हैं; या तो काम करेगा? –

+3

हालांकि आपको शीर्षलेख में वैश्विक नामस्थान में 'उपयोग' नहीं करना चाहिए, क्योंकि इससे हेडर के अन्य उपयोगकर्ताओं के लिए नाम संघर्ष हो सकता है। –

+1

@AviadChmelnik: यह काम करेगा, लेकिन जैसा कि माइक सेमुर बताता है, नाम नामों को शुरू करने की उच्च संभावना के कारण इसे एक खराब प्रोग्रामिंग अभ्यास माना जाता है (विशेष रूप से जब वैश्विक नामस्थान क्षेत्र में शीर्षलेख में रखा जाता है)। इसके बजाय यदि आप –

0

एंडी प्रोवल का जवाब बहुत अच्छा है, लेकिन कृपया शीर्षलेख में "std :: ostream का उपयोग करके" डालने का विरोध करें। यदि आप ऐसा करते हैं तो आपकी हेडर फ़ाइल का उपयोग करने वाली अन्य संकलन इकाइयों में डिफ़ॉल्ट रूप से यह नामस्थान 'प्रयुक्त' होगा और आप नेमस्पेस संघर्ष के साथ खराब संकलन त्रुटियां प्राप्त कर सकते हैं।

+2

'std :: ostream' का उपयोग कर नामस्थान में एक नाम डाल सकते हैं तो इसका चयन करें: 'ostream'। 'नेमस्पेस std;' का उपयोग करने के रूप में यह कहीं भी बड़ी समस्या के करीब नहीं है, जो ** प्रत्येक ** नाम को 'std' से उस नामस्थान में रखता है। –

+1

अन्य संकलन इकाइयों को केवल 'ओस्ट्रीम' नाम मिलेगा, नामस्थान नहीं। फिर भी, मैं मानता हूं कि यह एक बुरा विचार है। – juanchopanza

संबंधित मुद्दे