ऑटो रिटर्न प्रकार का टेम्पलेट और अस्पष्टता


20

मेरे पास एक अतिभारित टेम्पलेट फ़ंक्शन है:

template<typename T1, typename T2>
auto overMax(T1 a, T2 b)
{
    std::cout << __FUNCSIG__ << std::endl;

    return b < a ? a : b;
}

template<typename RT, typename T1, typename T2>
RT overMax(T1 a, T2 b)
{
    std::cout << __FUNCSIG__ << std::endl;

    return b < a ? a : b;
}

अगर मैं इसे इस तरह कहता हूं:

auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template

सब कुछ सही काम करता है, लेकिन

auto c = overMax<int>(4, 7.2); // error

अस्पष्ट कॉल का कारण बनता है।

ऐसा इंट , और ओके के साथ ऐसा क्यों है ?


4
मुझे लगता है कि .... संकलक इसे जिस तरह से देखता है, वह है: intक्या आप typename RTया को निर्दिष्ट कर रहे हैं typename T1? चूंकि 4यह भी एक है int, यह या तो हो सकता है। के साथ double, सीधे प्रकार से मेल 4नहीं खाता है , इसलिए दूसरा अधिभार पसंद किया जाता है। double
क्रिसमम

यह मुझे थोड़ा विचित्र लगता है क्योंकि आप रिटर्न प्रकार पर ओवरलोडिंग की तरह हैं, लेकिन उन टेम्पलेट्स के साथ जिनमें अलग-अलग मात्रा में पैरामीटर हैं।
बोरगेल्डर

जवाबों:


25

RTगैर समर्पण है, इसलिए जब इसे प्रदान नहीं template<typename T1, typename T2> auto overMax(T1 a, T2 b)किया जाता है , तो केवल बुलाया जा सकता है।

जब आप (आंशिक रूप से) एक टेम्पलेट तर्क प्रदान करते हैं, तो दोनों विधियाँ व्यवहार्य हैं,

लेकिन तर्क के आधार पर, एक बेहतर उम्मीदवार हो सकता है:

  • के लिये auto b = overMax<double>(4, 7.2); // uses second template

    दोनों overMax<double, int, double>और overMax<double, double>व्यवहार्य है।
    लेकिन overMax<double, int, double>सटीक मिलान है
    जबकि रूपांतरण की overMax<double, double>आवश्यकता intहै double

  • के लिये auto c = overMax<int>(4, 7.2); // Ambiguous call

    दोनों overMax<int, int, double>और overMax<int, double>व्यवहार्य है।
    लेकिन न तो एक बेहतर मैच है और न ही अधिक विशिष्ट है, इसलिए कॉल अस्पष्ट है।


उनमें से कोई भी बेहतर क्यों नहीं हैं? क्या मैं सही हूं कि मुट्ठी के मामले में <int> (4, 7.2); के रूपांतरण का कारण होता है 7.2 करने के लिए int । और दूसरे मामले में लौटा परिणाम, जो शुरू में दोगुना है , को स्पष्ट <int> के कारण int में बदल दिया जाएगा ?
एम्पलीफायर

1
@ एम्पलीफायर: overMax<int>(4, 7.2)पहले मामले में T1=int(प्रदान), T2=double(घटाया) और दूसरे मामले में RT=int(प्रदान), T1=int, T2=double(घटाया) होगा। ओवरलोड का चयन करने के लिए दोनों तरीकों की सामग्री की परिभाषा का उपयोग नहीं किया जाता है।
Jarod42

मेरे लिए, दूसरा मामला उपयुक्त है, क्योंकि पहले एक के लिए वापसी प्रकार रूपांतरण है और दूसरे के लिए कोई रूपांतरण नहीं है, है ना?
एम्पलीफायर

हम्म् ... वापसी प्रकार रूपांतरण भूमिका नहीं निभाता है ... फिर, हाँ, दोनों कॉल इस दृष्टिकोण से बराबर हैं
एम्पलीफायर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.