20

यह और अधिक परिष्कृत सवाल कोड compiles without any problem नीचे How does overload resolution work when an argument is an overloaded function?टेम्पलेट तर्क कटौती कैसे कार्य करता है जब ओवरलोडेड फ़ंक्शन किसी तर्क के रूप में शामिल होता है?

में उल्लेख किया है:

void foo() {} 
void foo(int) {} 
void foo(double) {} 
void foo(int, double) {} 

// Uncommenting below line break compilation 
//template<class T> void foo(T) {} 

template<class X, class Y> void bar(void (*f)(X, Y)) 
{ 
    f(X(), Y()); 
} 

int main() 
{ 
    bar(foo); 
} 

यह टेम्पलेट तर्क कटौती के लिए एक चुनौती भरा काम प्रकट नहीं होता है - केवल एक समारोह foo() कि दो स्वीकार करता है तर्क। हालांकि, foo() (जो अभी भी एक ही पैरामीटर है) के टेम्पलेट अधिभार को असम्बद्ध करना कोई स्पष्ट कारण के लिए संकलन तोड़ता है। संकलन जीसीसी 5.x/6.x और clang 3.9 दोनों के साथ विफल रहता है।

क्या इसे ओवरलोड रिज़ॉल्यूशन/टेम्पलेट तर्क कटौती के नियमों द्वारा समझाया जा सकता है या इसे उन कंपाइलरों में दोष के रूप में योग्यता प्राप्त की जानी चाहिए?

+3

यह सी ++ मानक की धारा 13.3 द्वारा समझाया गया है;) –

उत्तर

19

अपने लिंक किए गए सवाल का जवाब में बताया गया है:

[temp.deduct.call]/6: जब P एक समारोह का प्रकार, प्रकार कार्य करने के लिए सूचक, या सूचक सदस्य समारोह प्रकार है:

- तर्क एक है अधिभार सेट जिसमें एक या अधिक फ़ंक्शन टेम्पलेट होते हैं, पैरामीटर को गैर-कटौती संदर्भ के रूप में माना जाता है।

चूंकि अधिभार सेट में फ़ंक्शन टेम्पलेट होता है, पैरामीटर को गैर-कटौती संदर्भ के रूप में माना जाता है। इस कारण विफल टेम्पलेट तर्क कटौती:

[temp.deduct.type]/4: [...] टेम्पलेट पैरामीटर केवल गैर निष्कर्ष निकाला संदर्भों में प्रयोग किया जाता है और स्पष्ट रूप से तय नहीं है तो, टेम्पलेट तर्क कटौती विफल रहता है।

और यह विफल कटौती आपको आपकी त्रुटि देता है। ध्यान दें कि यदि आप स्पष्ट रूप से तर्क निर्दिष्ट करते हैं, कोड सफलतापूर्वक संकलित:

bar<int,double>(foo); 

Live demo

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