Implicit conversion to a C++ template object -


मेरे पास एक वर्ग ए है:

  टेम्पलेट & lt; typename T, int i & gt; संरचना ए {};   

और एक वर्ग बी। मैं ऑब्जेक्ट प्रकार बी की तरह से फ़ंक्शन एग्रेजेस के रूप में दिए जाने पर एन्क्वाइटल रूप से कन्वर्ट करना चाहता हूं। बी इस तरह दिखता है:

  टेम्पलेट & lt; typename T & gt; संरचना बी {ऑपरेटर ए एंड एलटी; टी, 0 & gt; & Amp; () कॉन्स्ट {वापसी * ​​नया ए & lt; टी, 0 & gt; (); }};   

हालांकि, मेरी परीक्षा (नीचे) जीसीसी 4.5 के साथ विफल हो जाती है, त्रुटि दे रही है: 'test (B & amp;)' के लिए कॉल करने के लिए कोई मेल नहीं फ़ंक्शन मैं कहाँ हूँ यहाँ गलत हो रहा है? क्या अन्य कंपाइलर्स भी इसे अस्वीकार करते हैं?

  टेम्पलेट & lt; typename T, int i & gt; शून्य परीक्षण (ए एंड एलटी; टी, आई & gt; & amp; ए) {हटाएं & amp; ए; } इंट मुख्य (इंटी argc, चार * argv []) {बी & lt; int & gt; ख; परीक्षण (ख); वापसी 0; }   

पीएस। मैंने अब नीचे दिए गए उत्तर में अपना खुद का समाधान रख लिया है।

यदि आप बी से एक निहित रूपांतरण चाहते हैं ए के लिए आपको या तो आवश्यकता होगी:

बी पर एक कास्ट ऑपरेटर:

  ऑपरेटर ए & lt; T, 0 & gt; ();   

या ए कन्स्ट्रक्टर जो बी संदर्भ लेता है:

  ए (कॉन्स्ट बी एंड अन्य);   

या ए से प्राप्त करने के लिए बी। आपने क्या घोषित किया है:

  ऑपरेटर ए & lt; T, 0 & gt; & Amp; () कॉन्स्ट;   

एक बीमार घोषित पता-अधिभार की तरह थोड़ा सा दिखता है।

हालांकि, क्योंकि परीक्षण () उस पर एक संदर्भ (और गैर-कॉन्सेबल) लेता है, कास्टिंग ऑपरेटर विकल्प काम नहीं करेगा।

यह मैंने तय किया है:

  टेम्पलेट & lt; typename T, int i & gt; संरचना ए {}; टेम्पलेट & lt; typename T & gt; संरचना बी {// ऑपरेटर ए & lt; T, 0 & gt; & Amp; () कॉन्स्ट {वापसी * ​​नया ए & lt; टी, 0 & gt; (); } टेम्पलेट & lt; इंट I & gt; ऑपरेटर ए एंड एलटी; टी, आई & gt; () कॉन्स्ट {रिटर्न ए एंड एलटी; टी, 0 & gt; (); }}; टेम्पलेट & lt; typename T, int I & gt; शून्य परीक्षण (ए एंड एलटी; टी, आई & gt; और amp;) {} int f () {B & lt; int & gt; ख; एक & lt; int, 0 & gt; ए (बी); परीक्षण (क); // & lt; - सफलता परीक्षण (बी); // & lt; - असफलता, "टेम्पलेट तर्क काटा नहीं जा सका" वापसी 0; }   

स्थानीय चर के प्रारंभ से रूपांतरण ठीक करता है।

Comments