मेरे पास एक वर्ग ए है:
टेम्पलेट & 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
Post a Comment