दिलचस्प पोस्ट
क्या C ++ का समर्थन संकलन समय काउंटर? सबसे ज्यादा परेशान पार्स: क्यों नहीं ए (()); काम? Java.lang.NoClassDefFoundError को हल करने के लिए कैसे करें: जावा 9 में javax / xml / bind / jAXBException प्रतिलिपि पेस्ट कैसे अक्षम करें (ब्राउज़र) एक फाइल को sdcard में लिखना जावास्क्रिप्ट फ़ंक्शन का रंग नामों को हेक्स कोड में रूपांतरित करने के लिए क्या स्प्रिंग @ ट्रान्सैसिअल विशेषता एक निजी विधि पर काम करती है? टुकड़ा जोड़ने या काम नहीं बदले नेविगेशन पट्टी आईओएस स्विफ्ट की ऊंचाई बदलना ईमेल HTML कोड बनाने के लिए सीएसएस शैली को स्वचालित रूप से इनलाइन करने के लिए कौन से उपकरण हैं? उपयोगकर्ता नाम के रूप में ईमेल पते की अनुमति देने के लिए Microsoft.AspNet.Identity को कॉन्फ़िगर करें रेल परिसंपत्ति पाइपलाइन के साथ फोंट का उपयोग करना गतिशील रूप से जावास्क्रिप्ट का प्रयोग कर चेकबॉक्स बनाना है? स्क्रिप्ट टैग का संदर्भ किस प्रकार किया जा सकता है जो वर्तमान में क्रियान्वित स्क्रिप्ट को लोड करता है? अच्छा PHP ORM लाइब्रेरी?

हमें यहां टाइप नाम की आवश्यकता क्यों है?

template<class T> class Set { public: void insert(const T& item); void remove(const T& item); private: std::list<T> rep; } template<typename T> void Set<T>::remove(const T& item) { typename std::list<T>::iterator it = // question here std::find(rep.begin(),rep.end(),itme); if(it!=rep.end()) rep.erase(it); } 

क्यों हटाने में टाइप नाम () की आवश्यकता है?

वेब के समाधान से एकत्रित समाधान "हमें यहां टाइप नाम की आवश्यकता क्यों है?"

सामान्य तौर पर, C ++ को दुर्भाग्यपूर्ण सिंटैक्स [*] की वजह से typename आवश्यकता typename है, जो इसे सी से typename है, जो गैर-स्थानीय जानकारी के बिना यह असंभव कहती है – उदाहरण के लिए – A * B; चाहे A नाम एक प्रकार (जो मामले में यह B के एक सूचक के रूप में एक घोषणा है) या नहीं (जो मामले में यह एक गुणा अभिव्यक्ति है – A बाद से संभव है, सभी के लिए आप गैर-स्थानीय जानकारी के बिना बता सकते हैं, एक ऐसे क्लास का उदाहरण हो सकता है जो operator* को कुछ अजीब करने के लिए ओवरलोड करता है 😉

अधिकांश मामलों में संकलक को गैर-स्थानीय जानकारी की आवश्यकता होती है जो अव्यवस्था (हालांकि दुर्भाग्यपूर्ण सिंटैक्स का अभी भी मतलब है कि कम-स्तरीय पार्सर को उच्च-स्तरीय परत से फ़ीडबैक की आवश्यकता होती है जो प्रतीक तालिका जानकारी रखती है) … लेकिन टेम्पलेट्स के साथ यह नहीं करता है 'टी (सामान्य तौर पर नहीं, हालांकि इस विशिष्ट मामले में यह तकनीकी तौर पर एक std::list<T> विशेषज्ञ होने के लिए गैरकानूनी हो सकता है ताकि इसके ::iterator एक प्रकार का नाम नहीं ;-)।

[*] न सिर्फ मेरी राय है, बल्कि केन थॉम्पसन और रोब पिइक की राय, वर्तमान में मेरे सहयोगियों, जो आंतरिक उपयोग के लिए एक नई प्रोग्रामिंग भाषा को तैयार करने और कार्यान्वित करने में व्यस्त हैं: नई प्रोग्रामिंग भाषा, जबकि इसका वाक्यविन्यास ज्यादातर सी-जैसा है , सी की सिंटैक्स डिज़ाइन त्रुटियों को दोहरा नहीं करता है – यह नई भाषा (जैसे कि अच्छे पुराने पास्कल में), सिंटैक्स पहचानकर्ताओं को पहचानने के लिए पर्याप्त है, जिन्हें किसी प्रकार से नाम देना चाहिए 😉

यदि आप std::list<T>::iterator साथ प्रयोग किए गए typename बारे में बात कर रहे हैं:

टाइप नाम का उपयोग स्पष्ट करने के लिए किया जाता है कि iterator क्लास std::list<T> परिभाषित एक प्रकार है। टाइपनाम के बिना, std::list<T>::iterator को एक स्थिर सदस्य माना जाएगा जब कोई नाम किसी टेम्पलेट पैरामीटर पर निर्भर करता है, तो टाइप नाम का उपयोग किया जाता है

आपके नाम पर 'इसे' के लिए टाइप नाम की आवश्यकता है क्योंकि अन्यथा कंपाइलर को यह नहीं पता है कि यह अभिव्यक्ति के बजाय एक प्रकार की घोषणा है

इस पृष्ठ के अनुसार, "यदि आप एक योग्य नाम है जो एक प्रकार का संदर्भ देता है और एक टेम्पलेट पैरामीटर पर निर्भर करता है, तो कीवर्ड टाइपनाम का उपयोग करें।"

मुझे लगता है कि आम तौर पर आपको क्लास घोषणापत्र के साथ ही फ़ंक्शन परिभाषाओं में टाइप नाम / वर्ग टी दोनों की आवश्यकता होती है क्योंकि आप फ़ंक्शन परिभाषाओं के लिए पूर्ण / आंशिक टेम्पलेट विनिर्देशों को परिभाषित कर सकते हैं। अर्थात। आप ints, तार, जो कुछ भी ऐसा होता है के लिए अपने निष्कासन समारोह के विशेषज्ञ हो सकता है तो इस मामले में आप कंपाइलर कह रहे हैं "यह किसी भी प्रकार के लिए सामान्य टेम्पलेट है", बाद में आप केवल उसी कार्य को परिभाषित कर सकते हैं जो केवल पूर्णांक के लिए निर्दिष्ट है