2017-10-20 37 views
5

निम्नलिखित उदाहरण पर विचार ऑपरेटर के साथ में लात नहीं करता है:अंतर्निहित रूपांतरण ऑपरेटर ओवरलोडिंग

#include <string> 
#include <sstream> 

struct Location { 
    unsigned line; 

    template<typename CharT, typename Traits> 
    operator std::basic_string<CharT, Traits>() const { 
    std::basic_ostringstream<CharT, Traits> ss; 
    ss << line; 
    return ss.str(); 
    } 
}; 

int main() 
{ 
    using namespace std::string_literals; 

    Location loc{42}; 

    std::string s1 = "Line: "s.append(loc) + "\n"s; // fine 
    //std::string s2 = "Line: "s + loc + "\n"s; // error 
} 

टिप्पणी की लाइन एक संकलन त्रुटि का कारण बनता है: no match for 'operator+'। क्यूं कर? मेरा प्रारंभिक विचार यह था कि यह पहले कनवर्ट करने के लिए operator std::string का उपयोग करेगा और फिर operator+ पर कॉल करें, वैसे ही यह .append के लिए भी करता है।

यह केवल एक स्तर का निहित रूपांतरण है, इसलिए इसे किया जाना चाहिए और इसे ध्यान में रखा जाना चाहिए, नहीं?

Live Demo

+0

पूछने के लिए खेद है, लेकिन मुझे कामकाजी कोड नहीं मिल रहा है। 'एस' क्या है? – gsamaras

+3

@gsamaras http://en.cppreference.com/w/cpp/string/basic_string/operator%22%22s – Holt

+0

दाएं @ होल्ट, धन्यवाद! – gsamaras

उत्तर

2

आपका ऑपरेटर टेम्प्लेटेड है, इस प्रकार टेम्पलेट तर्क निष्कर्ष निकाला जाना चाहिए। आप ऐसा नहीं कर सकते, क्योंकि संकलक basic_string<_CharT, _Traits, _Alloc> से आपके Location पर मिलान करने का प्रयास करता है, और यह विफल हो जाता है।

तो समस्या ओवरलोडिंग है, रूपांतरण नहीं, क्योंकि कोड वास्तव में उस बिंदु तक कभी नहीं पहुंचता है।

बदलें इस:

std::string s2 = "Line: "s + loc + "\n"s; 

यह करने के लिए:

std::string s2 = "Line: "s + std::string(loc) + "\n"s; 

और आप के बाद से यदि आप संकलक त्रुटि को बारीकी से देखें, ठीक हो जाना चाहिए, यह उल्लेख है:

template argument deduction/substitution failed: 
prog.cc:22:32: note: 'Location' is not derived from 'const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>' 
    std::string s2 = "Line: "s + loc + "\n"s; // error 
           ^~~ 

और अन्य समान संदेश।

0

स्पष्ट डाली एसटीडी :: स्ट्रिंग मेरे लिए काम करता है: https://godbolt.org/g/WZG78z

std::string s2 = "Line: "s + std::string(loc) + "\n"; // was error 
संबंधित मुद्दे