c++ - Multiple Inheritance Template Class -


  क्लास संदेश A {}; वर्ग संदेश B {}; टेम्पलेट & lt; कक्षा T & gt; वर्ग कतार {सार्वजनिक: आभासी ~ कतार () {} void submit (T & amp; x) {}}; कक्षा ए: सार्वजनिक कतार & lt; संदेश ए & gt ;, सार्वजनिक कतार & lt; messageB & gt; {}; Int main () {ए एए; aa.submit (messageA ()); aa.submit (messageB ()); }  

मेरा पहला सोचा है, उपरोक्त कोड ठीक होना चाहिए, क्योंकि कक्षा ए में 2 ओवरलोडेड फ़ंक्शन शामिल होंगे, जो संदेश A और MessageB ऑब्जेक्ट स्वीकार करेंगे।

हालांकि , कंपाइलर मुझे निम्नलिखित त्रुटि देता है:

क्या मुझे पता है कि एक अस्पष्ट क्यों है? क्या यह बिल्कुल स्पष्ट नहीं है, 1 के लिए कॉल सबमिट करें, मैं संदेश ए संस्करण को कॉल करना चाहता हूं? 2 जी सबमिट कॉल के लिए, मैं मेसेज बी वर्ज़न कॉल करना चाहता हूं?


  ------ बिल्ड शुरू किया गया: प्रोजेक्ट: मेन, कॉन्फिगरेशन: रिलीज़ विन 32 ------ कंपाइलिंग ... main.cpp। \ Main.cpp (21): त्रुटि C2385: 'सबमिट' का अस्पष्ट उपयोग हो सकता है 'सबमिट' आधार 'कतार में & lt; messageA & gt;' या 'क्यू' और 'लिखित संदेश' में 'जमा' हो सकता है; । \ Main.cpp (21): त्रुटि C3861: 'जमा करें': पहचानकर्ता नहीं मिला। \ Main.cpp (22): त्रुटि C2385: 'सबमिट' की अस्पष्ट पहुंच हो सकती है 'सबमिट' आधार 'कतार में & lt; messageA & gt; ' या 'क्यू' और 'लिखित संदेश' में 'जमा' हो सकता है; । \ Main.cpp (22): त्रुटि C2664: 'कतार & lt; T & gt; :: submit': पैरामीटर 1 को 'messageB' से 'messageA & amp; के साथ [T = messageA]। \ Main.cpp (22): त्रुटि C3861: 'सबमिट करें': पहचानकर्ता नहीं मिला  

मेरे पास अभी कोई संकलक नहीं है, लेकिन मुझे लगता है कि एक विरासत दूसरे को छिपा सकता है: कंपाइलर सही प्रतीक का उपयोग करने के लिए उपयोग करेगा, और यदि मुझे सही याद है, तो एक बार कंपाइलर एक उपयुक्त प्रतीक (यानी। , "प्रस्तुत" नामक एक विधि), यह माता-पिता और / या बाहरी स्कोप में अन्य लोगों के लिए खोज बंद कर देगी।

इस मामले में, मैंने सोचा कि दोनों विरासत कक्षाएं प्रतीक के लिए खोजी जाएंगी, लेकिन आपके सटीक संकलक (विज़ुअल सी ++ 2003? 2008? 2010?), मैं ज्यादा अनुमान नहीं लगा सकता।

कुछ विचारों के बाद, एक और संभावना यह है कि कंपाइलर ने दोनों प्रतीकों को प्राप्त किया, लेकिन यह तय करने में असमर्थ है कि प्रतीक संकल्प के उस पल, संकलक केवल नाम के लिए परवाह करता है, न कि इसकी सटीक प्रोटोटाइप)। मेरा मानना ​​है कि यह अंतिम विवरण सही है।

अपनी व्युत्पन्न कक्षाओं में कथन का उपयोग करके जोड़ने का प्रयास करें:

  वर्ग ए: सार्वजनिक कतार & lt; संदेश ए & gt; सार्वजनिक कतार & lt; messageB & gt ; {कतार का उपयोग करके & lt; संदेश ए & gt;; submit; क्यूई & lt; messageB & gt; :: submit; };  

ए क्लास स्कोप में सीधे दोनों तरीकों को प्रस्तुत करने के लिए।

ध्यान दें, यह भी कि आपके सबमिट विधियां गैर-कॉन्स्ट संदर्भ के रूप में संदेश ले रहे हैं निर्माता, आपके संदेश पैरामीटर अस्थायी हैं (और इस प्रकार, const r-values)।

इस रूप में मुख्य रूप से फिर से लिखना:

  int main () {एए; संदेश ए एमए; संदेश ए एमबी; aa.submit (एमए); aa.submit (MB); }  

संकलित करने में मदद कर सकता है (यह लाइन 22 पर कंपाइलर त्रुटि समझा सकता है)।

या आप इसके बजाय कंस्ट्रेंट संदर्भ को स्वीकार करने के लिए अपने सबमिट विधियों का प्रोटोटाइप बदल सकते हैं गैर-कॉन्स्ट संदर्भ।

ध्यान दें: फिर भी कंपाइलर के बिना, अपने कोड को मस्तिष्क-डीबग करने की कोशिश कर रहा है ... :-P ...


Comments

Popular posts from this blog

c# - sqlDecimal to decimal clr stored procedure Unable to cast object of type 'System.Data.SqlTypes.SqlDecimal' to type 'System.IConvertible' -

Calling GetGUIThreadInfo from Outlook VBA -

Obfuscating Python code? -