सबसे पहले, एक छोटे से उदाहरण है कि समस्या को दर्शाता है में रूपांतरण समारोह परिणाम निजी"अस्पष्ट डिफ़ॉल्ट प्रकार रूपांतरण" त्रुटि (C++)
foo.cpp: In function ‘int main()’:
foo.cpp:12:16: error: ambiguous default type conversion from ‘Bar’
foo.cpp:12:16: error: candidate conversions include ‘template<class T> Bar::operator T() const’
मेरी समझ यह है कि, क्योंकि संरचना ऑब्जेक्ट को "स्विच" किया जा रहा है, इसलिए संकलक एक अभिन्न या enum प्रकार में रूपांतरण फ़ंक्शन खोजने का प्रयास करेगा। मैं स्पष्ट रूप से बार :: बाज़ एनम प्रकार में एक सार्वजनिक रूपांतरण समारोह प्रदान करता हूं और इसे उपयोग करना चाहता हूं।
मुझे भ्रमित करने वाला हिस्सा यह है कि कंपाइलर को निजी रूपांतरण फ़ंक्शन भी मिलता है और फिर यह तय नहीं कर सकता कि किस का उपयोग करना है। यह निजी समारोह पर विचार क्यों कर रहा है? यदि मैं एक स्पष्ट कलाकार जोड़ता हूं, तो switch((int)bar)
कहें, फिर केवल निजी रूपांतरण फ़ंक्शन मैचों और संकलक सही रूप से शिकायत करते हैं कि यह निजी होने के बाद इसका उपयोग नहीं कर सकता है। इसलिए, चूंकि इस संदर्भ में निजी रूपांतरण फ़ंक्शन का उपयोग नहीं किया जा सकता है, इसलिए दोनों के बीच चुनाव क्यों नहीं है?
दिलचस्प बात यह है कि, मुझे विश्वास है (हालांकि मैं 100% निश्चित नहीं हूं) यह कोड g ++ 4.6 पर त्रुटि के बिना संकलित करता है।
संपादित करें: के रूप में टिप्पणी में जेम्स McNellis से कहा, तथ्य यह है कि निजी रूपांतरण समारोह टेम्प्लेट की गई है भी यहाँ प्रासंगिक है।
निहित रूपांतरणों का उपयोग न करें और आप बहुत खुश रहेंगे। –
निजी अधिभार संकल्प में नहीं आता है। – juanchopanza
क्लैंग, कॉमौ, और विजुअल सी ++ सभी इस कार्यक्रम को स्वीकार करते हैं। 'स्विच' का विनिर्देश बताता है कि" अस्तित्व या गणना प्रकार के लिए एक गैर-स्पष्ट रूपांतरण फ़ंक्शन मौजूद होना चाहिए। " यह शायद अधिभार संकल्प को सीमित करने के रूप में पढ़ा जा सकता है। इसलिए सवाल यह है: क्या "अन्य सभी चीजें समान हैं, नॉनटेम्प्लेट टेम्पलेट्स के लिए बेहतर हैं" नियम लागू होता है? –