दिलचस्प पोस्ट
अंगुलर जेएस में * अपने दायरे के साथ * कस्टम निर्देश के भीतर से माता पिता के दायरे तक कैसे पहुंचें? क्या मैं जावा / ग्रोविए में अपने विंडोज डेस्कटॉप वॉलपेपर को बदल सकता हूँ? सभी संदर्भों के साथ अनुक्रम को कैसे लोड करने के लिए विधानसभा को लोड करें? एक SWF को एक WebView में लोड करें ECMAScript6 तीर फ़ंक्शन जो एक ऑब्जेक्ट देता है सी # में "वापसी की प्रतीक्षा" का उद्देश्य क्या है? कैसे "बिल्ली << EOF" bash में काम करता है? कमांड लाइन तर्क पार्सिंग? तैयार कथन में "पसंद" वाइल्डकार्ड का उपयोग करना पी का उपयोग कैसे करें: पीढ़ी के भीतर स्ट्रीमिंग कंटेंट के साथ ग्राफिक इमेज: डेटाटेबल? आर में समाप्त "+" संकेत PHP: "नोटिस: अपरिभाषित चर", "नोटिस: अपरिभाषित सूचकांक", और "नोटिस: अपरिभाषित ऑफ़सेट" विंडोज पर अजगर ओएस.path.join जावास्क्रिप्ट में बड़ी संख्या के लिए वैज्ञानिक संकेतन से कैसे बचें? PHP 5.3 के साथ mssql कैसे काम करें?

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

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