2013-08-09 11 views
8

जहां तक ​​मुझे पता है, जब दो उम्मीदवारों के बीच चयन करने के लिए आ रहा है तो संकलक उस व्यक्ति को पसंद करेगा जो उसका सबसे कमजोर मैच मजबूत है। उदाहरण के लिए अगर मेरे पास है:ओवरलोडिंग रिज़ॉल्यूशन

void boo(int i, char c); 
void boo(double d, int i); 
निम्न कोड के लिए

: क्योंकि इसकी सबसे कमजोर मैच पदोन्नति है, जबकि पहले एक के मानक प्रकार रूपांतरण है

float f = 1.0; 
char c = 'c'; 
boo(f,c); 

दूसरा boo पसंद किया जाना चाहिए।

लेकिन जब मैंने उसे (जीसीसी उपयोग करते हुए) को संकलित करने का प्रयास करें, मैं:

error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second.

कोई भी विचार?

+14

मैं एक विचार है। उस त्रुटि संदेश को बार-बार पढ़ें जब तक कि यह स्पष्ट न हो कि C++ मानक कहता है कि यह संदिग्ध है। त्रुटि संदेश लिखने वाले डेवलपर के लिए –

+14

+1। – JNL

उत्तर

12

ओवरलोड रिज़ॉल्यूशन की आपकी समझ गलत है। सामान्य नियम (जब एक से अधिक तर्क होते हैं) चुनने के लिए एक फ़ंक्शन जिसके लिए कम से कम एक तर्क बेहतर होता है (यह कितना बेहतर है), और कोई भी अन्य खराब नहीं है। अन्य शब्दों में, संकलक प्रत्येक तर्क को अलग से संसाधित करता है, इसके लिए "सर्वश्रेष्ठ मिलान" का एक सेट बना रहा है। इसके बाद, इन सेटों का संघ लेता है: यदि छेड़छाड़ में बिल्कुल एक फ़ंक्शन है, तो आप जीत चुके हैं। अन्यथा, यह संदिग्ध है।

+0

हालांकि मुझे जावा के साथ सी ++ की तुलना नहीं की जानी चाहिए, लेकिन क्या उनके ओवरलोडिंग जांच प्रक्रिया में कोई अंतर है/जैसा कि उपरोक्त सी ++ संदिग्ध कोड स्निपेट जावा में काम करता है (प्रचारित प्रकार एक निष्पादन- यानी 'डबल इंट' एक – exexzian

+0

यहां काम कर रहा है जावा में कोड - http://ideone.com/8brQbE – exexzian

+0

धन्यवाद! (मुझे लगता है कि आप संघ के बजाय चौराहे का मतलब है) – user2668673

0

मान लें कि आपने फ़ंक्शन f कहा है। मुझे लगता है कि ओवरलोड रिज़ॉल्यूशन प्रक्रिया है: 1. उम्मीदवार कार्यों का एक सेट बनाना। कार्यों के इस सेट में एफ नामक सभी फ़ंक्शंस शामिल हैं जिन्हें उस बिंदु से एक्सेस किया जा सकता है जहां आपने f() कहा था। 2. व्यावहारिक कार्यों का एक सेट बनाना। फ़ंक्शंस का यह सेट उम्मीदवार कार्यों का एक सबसेट है जिसके लिए प्रत्येक व्यवहार्य फ़ंक्शन के पैरामीटर की संख्या f() को कॉल करने के लिए उपयोग किए जाने वाले तर्कों की संख्या से सहमत होती है। 3. सर्वोत्तम व्यवहार्य कार्य चुनता है। सबसे अच्छा व्यवहार्य कार्य वह व्यक्ति है जिसका पैरामीटर सभी अन्य व्यवहार्य कार्यों की तुलना में या तो बेहतर या समान रैंकिंग निहित रूपांतरण अनुक्रम है। यदि एक से अधिक या कम (बिल्कुल नहीं) हैं, तो संकलन त्रुटि होगी। निम्न उदाहरण यह अच्छी तरह दर्शाता है:

class cat 
{ 
public: 
    cat(int); 
}; 

void func(int, int, int, cat) 
{ 
    std::cout << 1 << std::endl; 
} 
void func(int, int, double, double) 
{ 
    std::cout << 2 << std::endl; 
} 

int main() 
{ 
    func(1,2,3,4); 
} 

इस कोड को एक संकलन त्रुटि (वी.एस.) या चेतावनी (छ ++) उत्पन्न करता है।

निम्नलिखित ठीक से चलेगा (प्रिंट 1):

void func(int, int, int, double) 
{ 
     std::cout << 1 << std::endl; 
} 
void func(int, double, double, double) 
{ 
     std::cout << 2 << std::endl; 
} 

int main() 
{ 
     func(1,2,3,4); 
} 
संबंधित मुद्दे