2013-08-12 3 views
6

में लागू रूपांतरण निम्नलिखित कोड को देखते हुए, संकलक Bar का निर्माण करते समय निहित रूपांतरण को क्यों हल नहीं करता है? यही है, Foo का निर्माण a जैसा बनाया गया था जिसे Bar बनाने के लिए उपयोग किया जाना चाहिए?सी ++

#include <string> 

class ImplicitlyConvertToChar 
{ 
public: 
    ImplicitlyConvertToChar(const char* a_char) 
    : m_string(a_char) 
    { } 

    ImplicitlyConvertToChar(const char* a_char, size_t a_end) 
    : m_string(a_char) 
    { 
    } 

    template <typename T_String> 
    ImplicitlyConvertToChar(T_String const& a_string) 
    : m_string(a_string.begin()) 
    { 
    } 

    operator char const *() const 
    { return m_string; } 

    const char* m_string; 
}; 

class Foo 
{ 
public: 

    Foo(const ImplicitlyConvertToChar& a_charLike) 
    : m_string(a_charLike) 
    { } 

    const char* m_string; 
}; 

class Bar 
{ 
public: 
    Bar(const Foo& a_foo) 
    : m_foo(a_foo) 
    { } 

    Foo m_foo; 
}; 

int main() 
{ 
    Foo a("this works"); 
    Bar b("Why doesn't this?"); 
} 
+0

यह मानक का हिस्सा है, निहित रूपांतरणों को इस तरह से जंजीर नहीं बनाया जा सकता है। आप केवल एक अंतर्निहित रूपांतरण कर सकते हैं। – IronMensan

उत्तर

9

आपको एक से अधिक उपयोगकर्ता परिभाषित अंतर्निहित रूपांतरण की अनुमति नहीं है। Foo उदाहरण में एक शामिल है, Bar उदाहरण में दो शामिल हैं।

4

कंपाइलर को केवल एक ही अंतर्निहित उपयोगकर्ता परिभाषित रूपांतरण करने की अनुमति है।

http://en.cppreference.com/w/cpp/language/implicit_cast

A user-defined conversion consists of: 
    zero or one non-explicit single-argument constructor or non-explicit 
    conversion function calls 

Bar का निर्माण इस तरह से दो की आवश्यकता होगी देखें।

+4

आपका उद्घाटन वाक्य सही नहीं है। कंपाइलर को एक एकल अंतर्निहित *** उपयोगकर्ता परिभाषित *** रूपांतरण करने की अनुमति है। यह कई अंतर्निहित *** मानक *** रूपांतरण कर सकता है क्योंकि इसे –

+2

पसंद है, मुझे लगता है कि इसे कोई भी पसंद नहीं आया। इस महत्वपूर्ण निरीक्षण को इंगित करने के लिए –

+1

@ आर्मेन टीसुरुयान धन्यवाद। उत्तर अपडेट किया गया। – zmb