कभी कभी यह एक अधूरी प्रकार के साथ एक मानक कंटेनर का दृष्टांत को एक पुनरावर्ती संरचना प्राप्त करने के लिए उपयोगी होता है:क्या मानक कंटेनर टेम्पलेट अपूर्ण प्रकारों के साथ तत्काल हो सकते हैं?
struct multi_tree_node { // Does work in most implementations
std::vector<multi_tree_node> child;
};
struct trie_node { // Does not work in most implementations
std::map< char, trie_node > next;
};
इसका कारण यह है कंटेनर प्रकार value_type
या सदस्य कार्यों कि पारित के सदस्यों की जरूरत नहीं है या किसी value_type
लौट काम करने के लिए जाता है मूल्य से वस्तुओं। मानक अपूर्ण टेम्पलेट तर्कों के बारे में बहुत कुछ नहीं कहता है, लेकिन सी ++ 11 §17.6.4.8 [lib.res.on.functions], "अन्य कार्यों पर आवश्यकताएं" के तहत एक बिट है:
विशेष रूप से, प्रभाव निम्न मामलों में अपरिभाषित हैं: ... यदि टेम्पलेट घटक को तत्काल करने पर टेम्पलेट तर्क के रूप में अपूर्ण प्रकार (3.9) का उपयोग किया जाता है, तब तक विशेष रूप से उस घटक के लिए अनुमति नहीं दी जाती है।
क्या इससे उपर्युक्त संरचनाएं अवैध होती हैं, भले ही तत्काल ब्लॉक दायरे में न हों? क्या यह "मानक लाइब्रेरी टेम्पलेट घटकों को चालू करने के लिए प्रयुक्त प्रकारों पर संचालन" के तहत आता है ((17.6.4.8)? या एक लाइब्रेरी कार्यान्वयन टेम्पलेट इंस्टॉलेशन के लिए वर्जित है जो अपूर्ण प्रकारों के लिए असफल हो सकता है जब सभी विशेष रूप से आवश्यक तत्काल आवश्यकताएं सफल होती हैं?
संपादित करें: के बाद से ही कार्यों फोन और ब्लॉक दायरे में उन लोगों के लिए अन्य कार्यों का दृष्टांत, सीमित "प्रकार पर कार्रवाई ..." हो सकता है हस्ताक्षर और सदस्य की सामग्री की तुलना में एक सख्त आवश्यकता के सदस्य कार्यों की सामग्री को धारण करने के लिए प्रतीत होता है कक्षा परिभाषाएं आखिरकार, को multi_tree_node
के साथ टाइप पूरा होने तक निश्चित रूप से यह समझ में नहीं आता है। और यह std::unique_ptr
तक फैला हुआ है जो ब्लॉक अपर में उपयोग किए जाने पर भी एक अपूर्ण प्रकार तर्क, का स्पष्ट रूप से समर्थन करता है।
संपादित करें 2:trie_node
उदाहरण का परीक्षण करने के लिए परेशान न करने के लिए मुझे सही काम करता है - और मैंने पहले भी इसकी कोशिश की है। यह the article में टूटने का उदाहरण है जो @Ise से जुड़ा हुआ है। हालांकि, लेख यह मानने के लिए लगता है कि "ऐसा कुछ भी काम नहीं कर सकता है," समाधान मेरे लिए आसान लगता है - std::map
की आंतरिक tree_node
कक्षा एक गैर-सदस्य टेम्पलेट होना चाहिए, न कि सदस्य गैर-टेम्पलेट वर्ग।
वैसे भी, यह आलेख डिजाइन इरादे को अच्छी तरह से स्थापित करता है, इसलिए मुझे लगता है कि "कार्यों पर आवश्यकताओं" के उपशीर्षक के तहत होने के बारे में मेरा नाइटपिक केवल यही है।
मुझे आपके द्वारा पोस्ट किए गए कोड में कोई अपूर्ण प्रकार नहीं दिख रहा है? –
@ जॉन डीबलिंग: 'trie_node'' अगले' को परिभाषित करते समय अपूर्ण है। –
@ जॉन डीबलिंग एक वर्ग के अपने दायरे के अंदर, यह अपूर्ण है। – Potatoswatter