को देखते हुए निम्नलिखित समारोह टेम्पलेट्स:संकलक निम्नलिखित उदाहरण में मेरे फ़ंक्शन-टेम्पलेट अधिभार का चयन क्यों नहीं कर रहा है?
#include <vector>
#include <utility>
struct Base { };
struct Derived : Base { };
// #1
template <typename T1, typename T2>
void f(const T1& a, const T2& b)
{
};
// #2
template <typename T1, typename T2>
void f(const std::vector<std::pair<T1, T2> >& v, Base* p)
{
};
क्यों है यह है कि निम्नलिखित कोड हमेशा अधिभार # 1 के बजाय # 2 अधिभार का आह्वान?
int main()
{
std::vector<std::pair<int, int> > v;
Derived derived;
f(100, 200); // clearly calls overload #1
f(v, &derived); // always calls overload #1
return 0;
}
यह देखते हुए कि f
का दूसरा पैरामीटर Base
की एक व्युत्पन्न प्रकार है, मुझे उम्मीद थी कि संकलक अधिभार # 2 का चयन करेंगे के रूप में यह # 1 अधिभार में सामान्य प्रकार की तुलना में एक बेहतर मुकाबला नहीं है।
क्या ऐसी कोई तकनीक है जिसका उपयोग मैं इन कार्यों को फिर से लिखने के लिए कर सकता हूं ताकि उपयोगकर्ता main
फ़ंक्शन (यानी, तर्क प्रकारों के संकलक-कटौती का लाभ उठाने) में प्रदर्शित कोड लिख सकें?
हालांकि यह मुख्य प्रश्न से संबंधित नहीं है, फिर भी: 1. 'int main()', कृपया। 2. आपकी टेम्पलेट फ़ंक्शन परिभाषाओं के बाद खाली घोषणाएं ';' हैं। यह सी ++ में अवैध है। – AnT