निम्नलिखित कोड पर विचार करें।संकलक एक प्रकार का रूपांतरण क्यों नहीं करता है?
#include <iostream>
#include <string>
struct SimpleStruct
{
operator std::string() { return value; }
std::string value;
};
int main()
{
std::string s; // An empty string.
SimpleStruct x; // x.value constructed as an empty string.
bool less = s < x; // Error here.
return 0;
}
यह कोड या तो g ++ या Microsoft Visual C++ पर संकलित नहीं करता है। कंपाइलर्स द्वारा दी गई त्रुटि रिपोर्ट no match for operator '<' in 's < x'
है। सवाल क्यों संकलक बस SimpleStruct x
string
में नहीं बदलता के अनुसार है operator string()
दिया और फिर operator < (string, string)
का उपयोग करें?
+1, यह उत्तर सही है। 'स्ट्रिंग :: ऑपरेटर <()' तर्क को 'कॉन्स्ट स्ट्रिंग' के रूप में नहीं लेता है, लेकिन 'basic_string <>'; यदि आप वैश्विक स्तर पर 'ऑपरेटर <' ओवरलोड करते हैं तो यह काम करता है। http://www.ideone.com/vMERa – iammilind
एह, 'std :: string' सिर्फ std :: basic_string' के लिए एक टाइपिफ़ है। 'typedef' एक नया प्रकार पेश नहीं करता है, और इसलिए ओवरलोडिंग को प्रभावित नहीं करता है। –
MSalters
अंतर्निहित समस्या यह है कि 'टेम्पलेट <कक्षा charT, कक्षा tr, कक्षा एलोक> बूल ऑपरेटर <(std :: basic_string const & lhs, std :: basic_string const & rhs); 'विफल रहता है। 'charT'' नहीं है जिसके लिए' basic_string '_equals_' SimpleStruct' है। यह वास्तव में ओवरलोड सेट से हटा देता है। –
MSalters