पर लागू रूपांतरण नीचे दिया गया मेरा उदाहरण बताता है कि गैर-टेम्पलेट प्रकारों से टेम्पलेट प्रकारों के निहित रूपांतरण निर्बाध रूप से काम नहीं करेंगे क्योंकि उनमें केवल गैर-टेम्पलेट प्रकार शामिल हैं। क्या उन्हें फिर भी काम करने का कोई तरीका है?टेम्पलेट
उदाहरण:
struct point;
template<unsigned d> struct vec {
vec() { }
// ...
};
template<> struct vec<2> {
vec() { }
vec(const point& p) { /* ... */ } // Conversion constructor
// ...
};
struct point {
operator vec<2>() { return vec<2>(/* ... */); } // Conversion operator
};
template<unsigned d> vec<d> foo(vec<d> a, vec<d> b) {
return vec<d>(/* ... */);
}
template<unsigned d1, unsigned d2>
vec<d1 + d2> bar(vec<d1> a, vec<d2> b) {
return vec<d1 + d2>(/* ... */);
}
int main(int argc, char** argv) {
point p1, p2;
vec<2> v2;
vec<3> v3;
foo(v2, p1);
foo(p2, v2);
foo(p1, p2);
bar(v3, p1);
}
वहाँ इस कोड को स्वत: परिवर्तित point
से vec<2>
को बताने के लिए एक तरीका है?
मैं जानता हूँ कि मैं foo
और bar
ओवरलोड कर सकते हैं point
तर्क के लिए अनुमति देने के लिए, एक स्पष्ट रूपांतरण का उपयोग vec
कार्यान्वयन के लिए सौंपने। लेकिन सभी पैरामीटर संयोजनों के लिए ऐसा करना कठिन हो जाएगा, खासकर ऐसे कई मानकों के साथ कार्यों के लिए। इसलिए मुझे समाधानों में दिलचस्पी नहीं है जहां मुझे प्रत्येक फ़ंक्शन के प्रत्येक पैरामीटर संयोजन के लिए कोड डुप्लिकेट करना होगा।
ऐसा प्रतीत होता है कि न तो रूपांतरण कन्स्ट्रक्टर और न ही कास्ट ऑपरेटर इसे प्राप्त करने के लिए पर्याप्त हैं। कम से कम मेरे जीसीसी 4.7.1 no matching function call
की रिपोर्ट करता है, हालांकि यह ‘point’ is not derived from ‘vec<d>’
बताते हुए नोटिस में वांछित फ़ंक्शन का नाम देता है।
कौन सी लाइन उस त्रुटि दे रही है? साथ ही, 'हस्ताक्षरित' एक सी ++ प्रकार नहीं है। –
@ जेम्स: फंक्शन इनवोकेशन के साथ लाइनों के लिए त्रुटियों की सूचना दी गई है, हालांकि नोटिस कई अन्य लाइनों का भी उल्लेख करते हैं। ऊपर दिए गए कोड की प्रतिलिपि बनाने और संकलित करने के लिए स्वतंत्र महसूस करें, क्योंकि यह स्वयं निहित है। [सी ++ 11 मानक] की धारा 3.9.1 (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf) नाम 'हस्ताक्षरित' नाम, तो क्यों होगा यह सी ++ प्रकार नहीं है, सी के साथ साझा किया गया है? – MvG
नहीं, यह 'हस्ताक्षरित लघु', 'हस्ताक्षरित लघु int',' हस्ताक्षरित int ',' हस्ताक्षरित लंबे int ', और' हस्ताक्षरित लंबे लंबे int 'को बिना हस्ताक्षर किए गए पूर्णांक प्रकारों के रूप में घोषित करता है। –