2015-09-16 9 views
12

मैं double और std::string दोनों के लिए रूपांतरण ऑपरेटरों के साथ एक Rectangle वर्ग है:अस्पष्ट उपयोग()

class Rectangle 
{ 
public: 
    Rectangle(double x, double y) : _x(x), _y(y) {} 
    operator std::string(); 
    operator double(); 
private: 
    double _x, _y; 
    double getArea() {return _x * _y;} 
}; 

int main() 
{ 
    Rectangle r(3, 2.5); 
    cout << r << endl; 
    return 0; 
} 

मुझे समझ नहीं आता क्यों operator double(), शुरू हो जाती है बल्कि operator std::string() से। जहां तक ​​मुझे पता है, C++ wikibook के अनुसार, operator doubleRectangle ऑब्जेक्ट्स को double में परिवर्तित करने के लिए उपयोग किया जाता है।

तो यहां क्या हो रहा है? क्या यह इस तथ्य से संबंधित है कि int कन्स्ट्रक्टर को पास किया गया है? यदि हां, तो क्यों?

+0

आयताकार को दो बार बदलने के लिए इसका क्या अर्थ है। –

+0

मुझे लगता है (डबल) आर या somethig –

+2

@AlexGoft नहीं, अन्य एलेक्स का मतलब है "इसका मतलब क्या है * तार्किक *?"। इसके चेहरे पर, ऑपरेशन अर्थहीन लगता है। –

उत्तर

11

आपके पास स्ट्रीम में आयत को आउटपुट करने के लिए ऑपरेटर नहीं है। cout में एक अधिभार है जो double लेता है और आपकी कक्षा को double पर रूपांतरित किया जा सकता है ताकि इसे चुना जा सके।

कारण स्ट्रिंग अधिभार चयनित नहीं है और नहीं माना जाता है के रूप में एक अस्पष्टता है क्योंकि एक स्ट्रिंग के लिए operator << एक सदस्य समारोह है और cout की member overload और non member overload सेट में शामिल नहीं है। अगर हम operator double पर टिप्पणी करते हैं तो हम we get a compiler error देख सकते हैं।

हम operator string कहा जाता है करना चाहते हैं तो हम की आवश्यकता होगी स्पष्ट रूप से एक स्ट्रिंग में r कास्ट करने के लिए। Live Example

+3

फिर यह 'स्ट्रिंग' रूपांतरण क्यों नहीं चुनता है? – interjay

+0

@interjay मैं बस उसमें देख रहा था। मैंने उस ऑपरेटर को नहीं देखा जब मैंने जवाब लिखा, – NathanOliver

+6

अच्छा पकड़। यदि कोई यह बताना चाहता था कि 'ऑपरेटर डबल()' को उन प्रकारों पर लागू क्यों किया जाता है जो किसी संख्या का प्रतिनिधित्व नहीं करते हैं, तो एक खराब अभ्यास है, उन्हें बेहतर चित्रण खोजने के लिए कड़ी मेहनत की जाएगी :-) – dasblinkenlight

6

जब से तुम Rectangle के लिए एक operator<< अधिभार नहीं प्रदान की थी, संकलक अन्य भार के जिसके लिए तर्क पैरामीटर प्रकार के लिए परिवर्तित किया जा सकता समझता है।

यदि किसी भी अधिभार टेम्पलेट्स हैं, तो टेम्पलेट तर्क प्रतिस्थापन अधिभार संकल्प से पहले उनके साथ होता है। संकलक फ़ंक्शन में दिए गए तर्कों के प्रकार से टेम्पलेट पैरामीटर को कम करने का प्रयास करता है।

string अधिभार एक टेम्पलेट तर्क प्रतिस्थापन विफलता की वजह से नहीं माना जाता है:

template <class CharT, class Traits, class Allocator> 
std::basic_ostream<CharT, Traits>& 
    operator<<(std::basic_ostream<CharT, Traits>& os, 
       const std::basic_string<CharT, Traits, Allocator>& str); 

खाका तर्क प्रतिस्थापन उपयोगकर्ता परिभाषित रूपांतरण पर विचार नहीं करता है, तो संकलक प्रकार अनुमान नहीं कर सकते CharT, Traits , या Allocator प्रकार Rectangle से, इसलिए यह अधिभार ओवरलोड रिज़ॉल्यूशन में भाग नहीं लेता है। (याद है कि std::string सिर्फ std::basic_string<char, std::char_traits<char>, std::allocator<char>> की एक typedef है।)

इसलिए operator<< में से एक अधिभार जो किसी भी अन्य की तुलना में बेहतर मैच है, और कहा कि double अधिभार है। एक टेम्पलेट नहीं, लेकिन एक वर्ग टेम्पलेट का एक सदस्य समारोह।

basic_ostream<CharT, Traits>& basic_ostream<CharT, Traits>::operator<<(double); 
+0

ध्यान दें कि अंतिम टेम्पलेट छोटा है; 'Std :: cout'' std :: basic_ostream <चार, std :: char_traits > से विरासत '। टेम्पलेट तर्क प्रतिस्थापन की कोई आवश्यकता नहीं है। – MSalters

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