2017-09-24 15 views
9

निम्न कोड के लिए:अस्पष्ट कॉल (स्थिरांक टी एंड, स्थिरांक टी एंड) या (स्थिरांक चार (&) [N], स्थिरांक चार (&) [एम])

#include <iostream> 
using std::cout; using std::endl; 

template <typename T> 
int compare(const T&, const T&) { 
    cout << __PRETTY_FUNCTION__ << endl; 
    return 0; 
} 
template <size_t N, size_t M> 
int compare(const char (&)[N], const char (&)[M]) { 
    cout << __PRETTY_FUNCTION__ << endl; 
    return 0; 
} 

int main(int argc, char *argv[]) { 
    compare("hi", "is"); 
} 

जब मैं g++ -std=c++1y साथ कोड को संकलित करता है, यह शिकायत:

error: call of overloaded ‘compare(const char [3], const char [3])’ is ambiguous 
    compare("hi", "is"); 

टेम्पलेट से अधिक भार के नियमों के अनुसार, व्यवहार्य कार्य हैं:

compare(const T&, const T&) with T = char [3] 
compare(const char (&)[N], const char (&)[M]) with N = 3ul, M = 3ul 

वे दोनों कॉल के लिए एक समान रूप से अच्छा (यानी सटीक) मैच प्रदान करते हैं। इसलिए मुझे यह जांचना चाहिए कि कौन सा अधिक विशिष्ट है।

लेकिन मेरे सीमित ज्ञान के अनुसार, const T&const char (&)[N] से अधिक सामान्य है। तो मुझे लगता है कि compare(const char (&)[N], const char (&)[M]) अधिक विशिष्ट है। लेकिन यह कॉल संदिग्ध क्यों है?

उत्तर

10

पहला अधिभार compare(const T&, const T&) दोनों पैरामीटर एक ही प्रकार के लिए मजबूर करता है, जबकि दूसरा अधिभार नहीं होता है। तो इस संबंध में पहला अधिभार अधिक विशिष्ट है।

हालांकि, दूसरा अधिभार दोनों मानकों को char सरणी होने के लिए मजबूर करता है, इसलिए यह उस संबंध में अधिक विशिष्ट है।

इसलिए, न तो अधिभार को दूसरे की तुलना में अधिक विशिष्ट कहा जा सकता है, और नतीजा अस्पष्टता त्रुटि है।

यह देखने का एक और तरीका यह है कि प्रत्येक ओवरलोड एक इनपुट स्वीकार कर सकता है जो दूसरा नहीं करता है: केवल पहला ओवरलोड एक कॉल स्वीकार करेगा जहां दोनों तर्क int& हैं। और केवल दूसरा ओवरलोड एक कॉल स्वीकार करेगा जहां तर्क char (&)[2] और char (&)[3] हैं।

आप

template <size_t N> int compare(const char (&)[N], const char (&)[N]) 

यह त्रुटि ठीक कर देंगे करने के लिए दूसरा अधिभार बदलने के लिए, के रूप में यह अब पहले अधिभार से सख्ती से अधिक विशिष्ट है।

+0

मैं स्पष्टीकरण पर सहमत हूं, लेकिन समाधान दूसरे 'तुलना' के बराबर आकार के तारों के उपयोग को सीमित करता है। – xtofl

+0

धन्यवाद। मैंने "विशेष" शब्द का अर्थ समझा होगा। लेकिन सी ++ में "विशेष" का सही नियम क्या है? मैंने सी ++ के विनिर्देश को नहीं पढ़ा है। और मैं पुस्तक सी ++ प्राइमर पढ़ रहा हूं। – zhenguoli

+0

@xtofl यह त्रुटि को ठीक करने के तरीके के लिए एक उदाहरण था। एक और उदाहरण दो अलग-अलग प्रकारों को लेने के लिए पहले अधिभार को बदल देगा। आवश्यकताओं को जानने के बिना मैं एक समाधान नहीं दे सकता जो उन्हें संतुष्ट करता है। – interjay

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