2017-06-18 23 views
13

पर विचार करें निम्नलिखित कोड:रूपांतरण ऑपरेटर के साथ उपयोग किए जाने पर संकलक टेम्पलेट पैरामीटर को क्यों नहीं हटा सकता?

#include <utility> 

template<typename T> 
struct wrapper { 
    T value; 
}; 

struct foo { 
    operator wrapper<int>() { 
     return{10}; 
    } 
}; 


int main() { 
    foo f; 
    wrapper w = f; // error 
    std::pair p = std::make_pair(1, 0); // ok 
} 

gcc 7.1.1 ऊपर चिह्नित लाइन पर संकलित करने के लिए विफल रहता है:

main.cpp: In function 'int main()': 
main.cpp:17:17: error: class template argument deduction failed: 
    wrapper w = f; // error 
       ^
main.cpp:17:17: error: no matching function for call to 'wrapper(foo&)' 
main.cpp:4:8: note: candidate: template<class T> wrapper(wrapper<T>)-> wrapper<T> 
struct wrapper { 
     ^~~~~~~ 
main.cpp:4:8: note: template argument deduction/substitution failed: 
main.cpp:17:17: note: 'foo' is not derived from 'wrapper<T>' 
    wrapper w = f; // error 
       ^

fwrapper<int> के लिए परिवर्तनीय है, इसलिए मुझे लगता है कि क्या होने की उम्मीद है। वहां से संकलक Tint को कम करने में सक्षम होना चाहिए। लेकिन यह नहीं कर सकता।

कंपाइलर std::pair के टेम्पलेट पैरामीटर को सही ढंग से घटा सकता है, इसलिए मुझे आश्चर्य है कि यह wrapper के साथ क्यों नहीं है।

कोई विचार?

+0

आईएमओ क्लास टेम्पलेट कटौती रूपांतरण ऑपरेटरों में देखा गया तो यह भ्रमित हो जाएगा। यदि इसकी आवश्यकता है, तो किसी को एक स्पष्ट कटौती मार्गदर्शिका का उपयोग करना चाहिए। – cpplearner

+0

संबंधित: https://stackoverflow.com/q/43019240/1896169 – Justin

+0

यह 'ऑपरेटर स्ट्रक्चर रैपर () 'क्या है? क्या यह 'ऑपरेटर रैपर' या 'ऑपरेटर() 'घोषित करता है? – cat

उत्तर

11

कक्षा टेम्पलेट तर्क कटौती के लिए, "ओवरलोड सेट" को [over.match.class.deduct/1] में वर्णित के रूप में बनाया गया है।

कार्य करता है और समारोह टेम्पलेट्स का एक सेट का निर्माण होता है शामिल:: उन निम्नलिखित हैं
(1.1) - टेम्पलेट नाम से नामित, यदि टेम्पलेट परिभाषित किया गया है प्राथमिक वर्ग टेम्पलेट में से प्रत्येक के निर्माता के लिए, एक समारोह टेम्पलेट निम्नलिखित गुणों के साथ:
(1.1.1) - टेम्प्लेट पैरामीटर टेम्पलेट वर्ग टेम्पलेट के टेम्पलेट मानकों (डिफ़ॉल्ट टेम्पलेट तर्क सहित) के बाद निर्माता के मापदंडों, यदि कोई हो रहे हैं।
(1.1.2) - फ़ंक्शन पैरामीटर के प्रकार कन्स्ट्रक्टर के हैं।
(1.1.3) - रिटर्न टाइप क्लास टेम्पलेट टेम्पलेट-नाम और टेम्पलेट तर्क द्वारा निर्दिष्ट विशेषज्ञता टेम्पलेट से प्राप्त टेम्पलेट पैरामीटर के अनुरूप है।

(1,2) - यदि प्राथमिक वर्ग टेम्पलेट सी परिभाषित नहीं है या किसी भी कंस्ट्रक्टर्स, एक अतिरिक्त समारोह एक काल्पनिक निर्माता सी से ऊपर के रूप में ली गई टेम्पलेट की घोषणा नहीं करता()।

(1.3) - परिकल्पनात्मक कन्स्ट्रक्टर सी (सी) से ऊपर के रूप में व्युत्पन्न एक अतिरिक्त फ़ंक्शन टेम्पलेट, जिसे कॉपी कटौती उम्मीदवार कहा जाता है।

(1,4) - प्रत्येक कटौती-गाइड, साथ एक समारोह या समारोह टेम्पलेट निम्नलिखित गुण के लिए:
(1.4.1) - टेम्पलेट पैरामीटर, यदि कोई हो, और समारोह मापदंडों deduction- के हैं मार्गदर्शक।
(1.4.2) - वापसी का प्रकार कटौती-मार्गदर्शिका का सरल-टेम्पलेट-आईडी है।

आप देख सकते हैं, मिलान "समारोह" 1.1 में केवल टेम्पलेट पैरामीटर प्रकार बिल्कुल को तर्क प्रकारों मैच के लिए प्रयास करता है। यह खाते में रूपांतरण नहीं लेता है (अधिकतर अन्य टेम्पलेट कटौती से संबंधित व्यवहार की तरह)।

std::pair के लिए यह काम करने का कारण आइटम 1.3 के कारण है, और "कॉपी कटौती उम्मीदवार" यह परिभाषित करता है।

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

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