निम्न कोड के लिए:अस्पष्ट कॉल (स्थिरांक टी एंड, स्थिरांक टी एंड) या (स्थिरांक चार (&) [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])
अधिक विशिष्ट है। लेकिन यह कॉल संदिग्ध क्यों है?
मैं स्पष्टीकरण पर सहमत हूं, लेकिन समाधान दूसरे 'तुलना' के बराबर आकार के तारों के उपयोग को सीमित करता है। – xtofl
धन्यवाद। मैंने "विशेष" शब्द का अर्थ समझा होगा। लेकिन सी ++ में "विशेष" का सही नियम क्या है? मैंने सी ++ के विनिर्देश को नहीं पढ़ा है। और मैं पुस्तक सी ++ प्राइमर पढ़ रहा हूं। – zhenguoli
@xtofl यह त्रुटि को ठीक करने के तरीके के लिए एक उदाहरण था। एक और उदाहरण दो अलग-अलग प्रकारों को लेने के लिए पहले अधिभार को बदल देगा। आवश्यकताओं को जानने के बिना मैं एक समाधान नहीं दे सकता जो उन्हें संतुष्ट करता है। – interjay