पर विचार करें निम्नलिखित कोड:रूपांतरण ऑपरेटर के साथ उपयोग किए जाने पर संकलक टेम्पलेट पैरामीटर को क्यों नहीं हटा सकता?
#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 ^
f
wrapper<int>
के लिए परिवर्तनीय है, इसलिए मुझे लगता है कि क्या होने की उम्मीद है। वहां से संकलक T
int
को कम करने में सक्षम होना चाहिए। लेकिन यह नहीं कर सकता।
कंपाइलर std::pair
के टेम्पलेट पैरामीटर को सही ढंग से घटा सकता है, इसलिए मुझे आश्चर्य है कि यह wrapper
के साथ क्यों नहीं है।
कोई विचार?
आईएमओ क्लास टेम्पलेट कटौती रूपांतरण ऑपरेटरों में देखा गया तो यह भ्रमित हो जाएगा। यदि इसकी आवश्यकता है, तो किसी को एक स्पष्ट कटौती मार्गदर्शिका का उपयोग करना चाहिए। – cpplearner
संबंधित: https://stackoverflow.com/q/43019240/1896169 – Justin
यह 'ऑपरेटर स्ट्रक्चर रैपर() 'क्या है? क्या यह 'ऑपरेटर रैपर' या 'ऑपरेटर() 'घोषित करता है? –
cat