2011-07-30 21 views
15

निम्नलिखित कार्यक्रम पर विचार करें:std :: जोड़ी के मेरे विशेषज्ञता के लिए मैं ऑपरेटर को परिभाषित करना चाहिए >>?

#include <iostream> 
#include <iterator> 
#include <vector> 
#include <utility> 
using namespace std; //just for convenience, illustration only 

typedef pair<int, int> point; //this is my specialization of pair. I call it point 

istream& operator >> (istream & in, point & p) 
{ 
    return in >> p.first >> p.second; 
} 

int main() 
{ 
    vector<point> v((istream_iterator<point>(cin)), istream_iterator<point>()); 
    //    ^^^       ^^^   
    //extra parentheses lest this should be mistaken for a function declaration 
} 

यह रूप में जल्द ही क्योंकि संकलित करने के लिए यह std किसी भी अधिक की है कि क्या ऑपरेटर एसटीडी में पाया एक था परवाह किए बिना वैश्विक विस्तार पर विचार नहीं करता के रूप में ADL नाम स्थान में ऑपरेटर पाता >> विफल रहता है व्यवहार्य उम्मीदवार या नहीं। यह बल्कि असुविधाजनक है। अगर मैं अपने ऑपरेटर की घोषणा को नेमस्पेस std (जो तकनीकी रूप से गैरकानूनी है) में घोषित करता है तो कोड अपेक्षाकृत अच्छी तरह संकलित होता है। क्या point बनाने के अलावा इस मुद्दे को हल करने का कोई तरीका है, इसे std namespace में टेम्पलेट के विशेषज्ञता के रूप में टाइप करने के बजाए अपनी खुद की कक्षा?

अग्रिम

+0

आप 'विशेषज्ञता नहीं कर रहे हैं std :: यहाँ pair'। मुझे लगता है कि इस तरह से एडीएल के मुकाबले टेम्पलेट कोड को पार्स किया गया है। –

उत्तर

11

धन्यवाद namespace std में operator>> की एक अधिभार जोड़ने से मना किया है, लेकिन एक टेम्पलेट विशेषज्ञता जोड़ने कभी कभी अनुमति दी है।

हालांकि, यहां कोई उपयोगकर्ता परिभाषित प्रकार नहीं हैं, और मानक प्रकारों पर ऑपरेटरों को फिर से परिभाषित करने के लिए आपका नहीं है। विशेषज्ञता operator>>(istream&, pair<mytype, int>) उचित होगा।


अनुभाग [namespace.std] (अनुभाग n3290 की 17.6.4.2.1) का कहना है

एक सी अगर यह नाम स्थान std भीतर std नाम स्थान या एक नाम स्थान के लिए करने के लिए घोषणाओं या परिभाषाओं कहते हैं ++ कार्यक्रम अपरिभाषित है व्यवहार जब तक अन्यथा निर्दिष्ट न किया जाये। कोई प्रोग्राम किसी भी मानक लाइब्रेरी टेम्पलेट के लिए std नाम पर टेम्पलेट विशेषज्ञता जोड़ सकता है, यदि घोषणा उपयोगकर्ता द्वारा परिभाषित प्रकार पर निर्भर करती है और विशेषज्ञता मूल टेम्पलेट के लिए मानक लाइब्रेरी आवश्यकताओं को पूरा करती है और स्पष्ट रूप से प्रतिबंधित नहीं है।

(जोर मेरा)

+0

क्या आपका उत्तर यह दर्शाता है कि मेरे प्रश्न का उत्तर *** नहीं *** है और मुझे 'अलग' वर्ग को अलग करना चाहिए? –

+0

बेन वोगेट के लिए बोलते हुए, मैं कहूंगा कि हाँ, यह करता है। –

+0

@ बेनोइट: वैसे, मुझे समझ में नहीं आता कि मानक प्रकारों पर ऑपरेटर _re_define के लिए मेरा नहीं हैं। जोड़ी के लिए कोई ऑपरेटर नहीं है, इसलिए मैं कुछ भी नहीं कर रहा हूं, क्या मैं हूं? –