दिलचस्प पोस्ट
कोणीय 2 टाइपस्क्रिप्ट एप में पल। जेएस लाइब्रेरी का उपयोग कैसे करें? गिट और मर्कुरियल – तुलना करें और कंट्रास्ट अजगर में एक्सटेंशन के बिना फ़ाइलों के प्रकार की जांच कैसे करें? एंड्रॉइड: VPNService API का उपयोग करके एंड्रॉइड 4.0 में अपने वीपीएन कनेक्शन का उपयोग करने के लिए नमूना कोड MVCBuildViews सही ढंग से काम नहीं कर रहा है Excel-VBA में SQL डेटाबेस तक पहुंच वस्तु के लिए प्रकार घोषित गतिशील मिलता है शब्दकोश में अधिकतम मूल्य के साथ कुंजी हो रही है? माइक्रोसॉफ्ट एक्सेल में डार्कट्रिक्स को सीसीवी फाइलों में जोड़ता है? Php में एसक्यूएल चर बाँध कैसे करें? "सत्र कैश सीमक नहीं भेज सकते हैं – हेडर जो पहले से भेजे गए हैं" उपयोग किए गए हेडरों को ढूंढने के लिए उपकरण जो अप्रयुक्त हैं? मठ अभिव्यक्ति पार्स जांचें कि क्या एक पायथन सूची आइटम में एक स्ट्रिंग के अंदर एक स्ट्रिंग है Google Play ऐप साइनिंग को कैसे सक्षम करें

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

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); } 

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

Solutions Collecting From Web of "हमें यहां टाइप नाम की आवश्यकता क्यों है?"

सामान्य तौर पर, 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, तार, जो कुछ भी ऐसा होता है के लिए अपने निष्कासन समारोह के विशेषज्ञ हो सकता है तो इस मामले में आप कंपाइलर कह रहे हैं "यह किसी भी प्रकार के लिए सामान्य टेम्पलेट है", बाद में आप केवल उसी कार्य को परिभाषित कर सकते हैं जो केवल पूर्णांक के लिए निर्दिष्ट है