2012-06-01 19 views
5

सबसे पहले, एक छोटे से उदाहरण है कि समस्या को दर्शाता है में रूपांतरण समारोह परिणाम निजी"अस्पष्ट डिफ़ॉल्ट प्रकार रूपांतरण" त्रुटि (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 से कहा, तथ्य यह है कि निजी रूपांतरण समारोह टेम्प्लेट की गई है भी यहाँ प्रासंगिक है।

+0

निहित रूपांतरणों का उपयोग न करें और आप बहुत खुश रहेंगे। –

+0

निजी अधिभार संकल्प में नहीं आता है। – juanchopanza

+3

क्लैंग, कॉमौ, और विजुअल सी ++ सभी इस कार्यक्रम को स्वीकार करते हैं। 'स्विच' का विनिर्देश बताता है कि" अस्तित्व या गणना प्रकार के लिए एक गैर-स्पष्ट रूपांतरण फ़ंक्शन मौजूद होना चाहिए। " यह शायद अधिभार संकल्प को सीमित करने के रूप में पढ़ा जा सकता है। इसलिए सवाल यह है: क्या "अन्य सभी चीजें समान हैं, नॉनटेम्प्लेट टेम्पलेट्स के लिए बेहतर हैं" नियम लागू होता है? –

उत्तर

3

अभिगम नियंत्रण अधिभार संकल्प के बाद आता है। इस मानक में निर्दिष्ट किया जाता, §13.3

Overload resolution is a mechanism for selecting the best function to call given a list of expressions that are to be the arguments of the call and a set of candidate functions that can be called based on the context of the call. The selection criteria for the best function are the number of arguments, how well the arguments match the types of the parameters of the candidate function, how well (for nonstatic member functions) the object matches the implied object parameter, and certain other properties of the candidate function. [Note: the function selected by overload resolution is not guaranteed to be appropriate for the context. Other restrictions, such as the accessibility of the function, can make its use in the calling context ill-formed. ]

तो अधिभार संकल्प एक समारोह है कि दिए गए संदर्भ के लिए उपयुक्त नहीं है चुन सकते हैं।

+0

धन्यवाद, यह सही है। यह अजीब लगता है कि यह जी ++ 4 के साथ संकलित होगा।6, लेकिन अगर मुझे लगता है कि यह मानक के उल्लंघन में है। –

+1

@DrewFrank यह एक दिलचस्प सवाल है। मैंने इसे कभी भी स्विच और टेम्पलेट्स के साथ नहीं देखा था, इसलिए अभी ईमानदार होने के लिए मैं यह सुनिश्चित नहीं कर सकता कि दो व्यवहार कौन सा मानक मानक है। – juanchopanza

+1

क्या आप इस मामले में ओवरलोड रिज़ॉल्यूशन व्यवहार की व्याख्या करेंगे? यही है, 'स्विच' के विनिर्देशन और "अन्य सभी चीजें बराबर होने के कारण, टेम्पलेट्स के लिए नॉनटेम्प्लेट बेहतर हैं" नियम, एक अस्पष्टता क्यों है? –

-1
switch(expression) 

अभिव्यक्ति एक अभिन्न प्रकार के या एक वर्ग प्रकार जिसके लिए अभिन्न प्रकार के लिए एक स्पष्ट रूपांतरण है का होना चाहिए।

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