मिनिमल कार्यक्रम:समान हस्ताक्षर के साथ टेम्पलेट फ़ंक्शन ओवरलोडिंग, यह क्यों काम करता है?
#include <stdio.h>
#include <type_traits>
template<typename S, typename T>
int foo(typename T::type s) {
return 1;
}
template<typename S, typename T>
int foo(S s) {
return 2;
}
int main(int argc, char* argv[]) {
int x = 3;
printf("%d\n", foo<int, std::enable_if<true, int>>(x));
return 0;
}
उत्पादन:
1
क्यों इस एक संकलन त्रुटि नहीं करता है? जब टेम्पलेट कोड उत्पन्न होता है, तो क्या कार्य int foo(typename T::type search)
और int foo(S& search)
समान हस्ताक्षर नहीं होंगे?
आप बदलना टेम्पलेट समारोह एक छोटा सा, यह अभी भी काम करता है (जैसा कि मैंने ऊपर के उदाहरण दिए गए अपेक्षा करेंगे) हस्ताक्षर हैं: फिर भी
template<typename S, typename T>
void foo(typename T::type s) {
printf("a\n");
}
template<typename S, typename T>
void foo(S s) {
printf("b\n");
}
यह नहीं और अभी तक सिर्फ इतना फर्क है एक है कि करता है एक int हस्ताक्षर और दूसरा पहले टेम्पलेट पैरामीटर द्वारा परिभाषित किया गया है।
template<typename S, typename T>
void foo(typename T::type s) {
printf("a\n");
}
template<typename S, typename T>
void foo(int s) {
printf("b\n");
}
संकलक त्रुटि (बजना):
test.cpp:26:2: error: call to 'foo' is ambiguous
foo<std::enable_if<true, int>>(3);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.cpp:16:6: note: candidate function [with T = std::__1::enable_if<true, int>]
void foo(typename T::type s) {
^
test.cpp:21:6: note: candidate function [with T = std::__1::enable_if<true, int>]
void foo(int s) {
^
1 error generated.
मैं एक परियोजना मैं पर काम कर रहा हूँ के लिए इस के समान कोड का उपयोग कर रहा है और मैं आसानी से भाषा डर वहाँ एक बात यह है कि कर रहा हूँ कि मैं मैं समझ नहीं पा रहा हूं कि कुछ मामलों में कुछ अपरिभाषित व्यवहार का कारण बन जाएगा। मुझे यह भी उल्लेख करना चाहिए कि यह क्लैंग और वीएस 11 दोनों में संकलित करता है, इसलिए मुझे नहीं लगता कि यह सिर्फ एक कंपाइलर बग है।
संपादित करें: दूसरा दूसरा मामला (टाइपो); क्लैंग से जोड़ा गया त्रुटि संदेश।
संपादित करें # 2: आप में से उन लोगों के लिए जो टी :: प्रकार का मतलब है।
http://en.cppreference.com/w/cpp/types/enable_if से:
टेम्पलेट < bool बी, वर्ग टी = शून्य> struct enable_if;
यदि बी सत्य है, तो std :: enable_if में एक सार्वजनिक सदस्य टाइपपीफ प्रकार है, बराबर टी के लिए; अन्यथा, कोई सदस्य टाइपिफ़ नहीं है।
enable_if एक संरचना है। असल में, अगर enable_if के पहले टेम्पलेट पैरामीटर में मूल्यांकन की गई अभिव्यक्ति सत्य है (और ऊपर दिए गए मेरे उदाहरणों के मामले में), तो उसके बाद एक सार्वजनिक सदस्य type
होगा जो दूसरे टेम्पलेट पैरामीटर के समान प्रकार होगा।
enable_if<true, int>
के मामले में, enable_if :: प्रकार में int का एक प्रकार है।
यह आश्चर्य की बात नहीं है कि आपका अंतिम मामला संकलित नहीं होता है। जब आप फ़ंक्शन (ओं) को केवल एक प्राप्त करते हैं तो आप दो टेम्पलेट तर्कों का उपयोग कर रहे हैं। –
धन्यवाद, मुझे लगता है कि मैंने वहां गलत मामला कॉपी किया है। फिक्स्ड। – vmrob
मैं एक सी ++ नोब हूं इसलिए मुझे कठोर मत करो ... क्या पहला उदाहरण काम नहीं करता क्योंकि आप पहली विधि को ओवरराइड कर रहे हैं? मुझे इसका जवाब जानने में दिलचस्पी है। मैं अगले वर्ष सी ++ सीखने की योजना बना रहा हूं। –