मान लिया जाये कि मैं दो वर्गों, आदिम प्रकार लिखने के लिए सबसे पहले एक (bool
, int
, float
, आदि) और दूसरा एक विस्तार पहले भी जटिल प्रकार लिखना पड़ा:सी ++ इस टेम्पलेट विधि को विधि अधिभार में क्यों पसंद करता है?
struct Writer {
virtual void Write(int value) = 0;
};
struct ComplexWriter : public Writer {
template <typename TValue> void Write(const TValue &value) {
boost::any any(value);
Write(any);
}
//virtual void Write(int value) = 0; // see question below
virtual void Write(const boost::any &any) = 0;
};
विचार है कि यदि है कोई myWriter.Write(someIntValue);
पर कॉल करता है, int अधिभार टेम्पलेट विधि पर प्राथमिकता प्राप्त करेगा।
इसके बजाय, मेरा कंपाइलर (विजुअल सी ++ 11.0 आरसी) हमेशा टेम्पलेट विधि चुनता है। निम्नलिखित कोड का टुकड़ा, उदाहरण के लिए, कंसोल के लिए Wrote any
प्रिंट होगा:
struct ComplexWriterImpl : public ComplexWriter {
virtual void Write(int value) { std::cout << "Wrote an int"; }
virtual void Write(const boost::any &any) { std::cout << "Wrote any"; }
};
void TestWriter(ComplexWriter &writer) {
int x = 0;
writer.Write(x);
}
int main() {
ComplexWriterImpl writer;
TestWriter(writer);
}
व्यवहार अचानक बदल जाता है जब मैं ComplexWriter
कक्षा में Write(int)
प्रणाली की घोषणा के साथ-साथ (देखें पहली लाइन खोजें बाहर टिप्पणी की)। इसके बाद यह कंसोल पर Wrote an int
प्रिंट करता है।
क्या यह मेरे संकलक को व्यवहार करना चाहिए? क्या सी ++ मानक स्पष्ट रूप से कहता है कि एक ही कक्षा (और आधार वर्ग नहीं) में परिभाषित केवल ओवरलोड को एक टेम्पलेट विधि पर प्राथमिकता दी जाएगी?
मैं नहीं दिख रहा है जहाँ आप एक टेम्प्लेट के साथ एक विधि लेने पूर्णांक ओवरलोड। आपके पास दो असंबंधित वर्ग हैं, 'राइटर' एक विधि के साथ 'int' और' ComplexWriter 'लेने वाली विधि के साथ (और' बूस्ट :: किसी भी कॉन्स्ट 'और' विधि 'लेते हुए एक विधि है। अपने परीक्षण कोड में आप 'ComplexWriter' का उपयोग करते हैं, इसलिए निश्चित रूप से यह' ComplexWriter' के सदस्य को कॉल करेगा। यदि आप वास्तव में पूरी तरह से असंबंधित वर्ग 'लेखक' के सदस्य को कॉल करने की उम्मीद करते हैं, तो क्या आप समझा सकते हैं कि क्यों (और कैसे) इसे करना चाहिए? – celtschk
आप उल्लेख करते हैं कि 'ComplexWriter'' राइटर 'बढ़ाता है, लेकिन आपके द्वारा सूचीबद्ध कोड में यह' राइटर 'से प्राप्त नहीं होता है। क्या यह सही सेटअप है? – Attila
इसे इंगित करने के लिए धन्यवाद। हां, कॉम्प्लेक्सवाइटर को राइटर से प्राप्त करना था। मैंने तदनुसार सवाल अपडेट किया। नतीजा अभी भी वही है (हालांकि निश्चित रूप से यह निर्दिष्ट करना भूल जाता है कि आधार वर्ग मेरे प्रश्न के मूल से जुड़ता है।)। – Cygon