"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > ## टेम्प्लेट बेस क्लास के साथ एकाधिक वंशानुक्रम सदस्य फ़ंक्शन रिज़ॉल्यूशन में अस्पष्टता का कारण क्यों बनता है?

## टेम्प्लेट बेस क्लास के साथ एकाधिक वंशानुक्रम सदस्य फ़ंक्शन रिज़ॉल्यूशन में अस्पष्टता का कारण क्यों बनता है?

2024-11-08 को प्रकाशित
ब्राउज़ करें:403

## Why Does Multiple Inheritance with Template Base Classes Cause Ambiguity in Member Function Resolution?

एकाधिक वंशानुक्रम को स्पष्ट करने में अस्पष्टता

टेम्पलेट बेस क्लास का उपयोग करते हुए एकाधिक वंशानुक्रम से निपटने पर, अस्पष्ट सदस्य फ़ंक्शन समाधान के संबंध में एक संभावित समस्या उत्पन्न होती है। निम्नलिखित परिदृश्य पर विचार करें:

template 
class Base {
public:
  template 
  typename std::enable_if::value>::type foo() {
    std::cout 

यहां, फ़ंक्शन foo() केवल तभी कॉल करने योग्य होता है जब टेम्पलेट पैरामीटर टाइप पैक में किसी एक प्रकार से मेल खाता है। अब, यदि एक व्युत्पन्न वर्ग गैर-अतिव्यापी प्रकार सेट के साथ एकाधिक आधार वर्गों से प्राप्त होता है, तो संकलक foo() कॉल को हल करते समय अस्पष्टता का सामना कर सकता है।

struct Derived: public Base,
                public Base
{};

इस मामले में, कॉल Derived().foo() आदर्श रूप से Base से foo() सदस्य फ़ंक्शन को कॉल करेगा। हालाँकि, जीसीसी और क्लैंग दोनों अस्पष्टता की रिपोर्ट करते हैं। सी मानक के अनुसार, यदि सदस्य फ़ंक्शन को व्युत्पन्न वर्ग में ही घोषित नहीं किया गया है, तो लुकअप प्रक्रिया बदले में आधार वर्गों की खोज करती है। हालाँकि, यदि बेस क्लास में घोषणा सेट भिन्न होते हैं, तो मर्ज अस्पष्ट हो जाता है। दो आधार वर्ग. चूंकि आधार वर्गों में foo() के लिए अलग-अलग घोषणा सेट होते हैं, इसलिए मर्ज के परिणामस्वरूप अस्पष्टता होती है।

Solutions

इस अस्पष्टता को हल करने के लिए, एक विकल्प घोषणाओं का उपयोग करना है वांछित सदस्य कार्यों को स्पष्ट रूप से आयात करने के लिए व्युत्पन्न वर्ग में। हालाँकि, इसके लिए उपयोगकर्ता को इन घोषणाओं को जोड़ने की आवश्यकता होती है, जो बड़े प्रकार की सूचियों के लिए क्रियात्मक और अव्यावहारिक हो सकती है।

संरचना व्युत्पन्न: सार्वजनिक आधार, सार्वजनिक आधार { Base::foo; का उपयोग करना Base::foo; का उपयोग करना; };

वैकल्पिक रूप से, कोई एक सहायक वर्ग का उपयोग कर सकता है जो सभी आधार वर्गों से सदस्य कार्यों को एकत्र और विलय करता है, जिससे व्युत्पन्न वर्ग को सीधे उन तक पहुंचने की अनुमति मिलती है।

टेम्पलेट संरचना बेसकलेक्टर: आधार... { Bases::foo...; का उपयोग करना }; संरचना व्युत्पन्न: बेसकलेक्टर, बेस> {};

इस दृष्टिकोण के साथ, उपयोगकर्ता को अस्पष्टता को हल करने के लिए कोई अतिरिक्त घोषणा जोड़ने की आवश्यकता नहीं है। बेसकलेक्टर वर्ग सभी आधार वर्गों से घोषणा सेटों को प्रभावी ढंग से विलय कर देता है, जिससे foo() फ़ंक्शन बिना किसी अस्पष्टता के व्युत्पन्न वर्ग के लिए उपलब्ध हो जाता है।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3