दिलचस्प पोस्ट
StandardOutput.ReadToEnd () लटका हुआ है इस संदर्भ में केवल आदिम प्रकार या गणण प्रकार समर्थित हैं विंडोज में जेएनए कुंजीपटल हुक मैं GitHub पर कमिट कैसे निकाल सकता हूं? ElementFormDefault एक्सएसडी में क्या करता है? मैं बच्चों की संख्या कैसे गिना सकता हूं? कैमरे से खींचा UIimages का आकार बदलने के लिए UIimage भी रोटेट करता है? कैसे जावा में अंतर मानों को जोड़ना है? जावा में किसी अन्य थ्रेड से थ्रेड कैसे रोकें और फिर से शुरू करें जावा में प्रतीक्षा करें और सूचित कैसे करें? fgets scanf के बाद काम नहीं करता है स्थिर सूचकांक? 0.0.0.0, 127.0.0.1 और लोकलहोस्ट के बीच अंतर क्या है? मैं गतिशील रूप से एक जावास्क्रिप्ट फाइल कैसे लोड करूँ? एंड्रॉइड डाल्विक पर मैं कौन से प्रोग्रामिंग भाषा का उपयोग कर सकता हूं?

आप C ++ में निर्भर नाम कैसे समझते हैं

मैं आमतौर पर टेम्पलेट्स के संदर्भ में इस अवधि के "आश्रित नाम" में आया हूं। हालांकि, मैं शायद ही कभी बाद के स्पर्श। इस प्रकार, स्वाभाविक रूप से निर्भर नामों की अवधारणा के बारे में अधिक जानना चाहूंगा।

टेम्पलेट के संदर्भ में और उनके बाहर आप इसे कैसे समझते हैं? उदाहरण को गंभीर रूप से प्रोत्साहित किया जाता है!

वेब के समाधान से एकत्रित समाधान "आप C ++ में निर्भर नाम कैसे समझते हैं"

एक निर्भर नाम अनिवार्य रूप से ऐसा नाम है जो टेम्पलेट तर्क पर निर्भर करता है।

टेम्प्लेट का उपयोग करते समय टेम्पलेट की परिभाषा के बिंदु और तात्कालिकता के बिंदु के बीच भेद होता है, जहां आप वास्तव में टेम्पलेट का उपयोग करते हैं। नाम जो कि किसी टेम्पलेट पर निर्भर करते हैं, उस समय तक बाध्य नहीं होते जब तक कि नाम उन परिभाषाओं पर बाध्य नहीं होते हैं।

एक सरल उदाहरण होगा:

template< class T > int addInt( T x ) { return i + x.toInt(); } 

जहां एक घोषणा या परिभाषा i ऊपर दी गई परिभाषा से पहले प्रकट होने की आवश्यकता होगी, क्योंकि i टेम्पलेट तर्क T पर निर्भर नहीं होती है और इसलिए परिभाषा के बिंदु पर बाध्य है। अभी तक अज्ञात-प्रकार x चर के toInt सदस्य की परिभाषा केवल addInt समारोह से पहले दिखाई addInt है, क्योंकि यह वास्तव में कहीं पर निर्भर है क्योंकि यह एक आश्रित नाम है (तकनीकी रूप से तात्कालिकता को निकटतम बंद वैश्विक या नामस्थान के रूप में लिया जाता है उपयोग के बिंदु से पहले का गुंजाइश है और इसलिए इसे पहले उपलब्ध होना है)।

आश्रित नाम टेम्पलेट तर्क पर निर्भरता की विशेषता है। तुच्छ उदाहरण:

 #include <vector> void NonDependent() { //You can access the member size_type directly. //This is precisely specified as a vector of ints. typedef std::vector<int> IntVector; IntVector::size_type i; /* ... */ } template <class T> void Dependent() { //Now the vector depends on the type T. //Need to use typename to access a dependent name. typedef std::vector<T> SomeVector; typename SomeVector::size_type i; /* ... */ } int main() { NonDependent(); Dependent<int>(); return 0; } 

संपादित करें : जैसा कि मैंने नीचे दी गई टिप्पणी में उल्लेख किया है, यह आश्रित नामों का उपयोग करने के बारे में एक विशिष्ट स्थिति का एक उदाहरण है, जो बहुत बार प्रकट होता है। कभी-कभी आश्रित नामों के उपयोग के नियम नियमों की अपेक्षा सहज रूप से अपेक्षा नहीं कर सकते हैं।

उदाहरण के लिए, यदि आपके पास एक आश्रित वर्ग है जो एक घृणित आधार से प्राप्त किया गया है, लेकिन एक दायरे के भीतर जहां बेस क्लास का नाम जाहिरा तौर पर टेम्पलेट पर प्रदर्शित नहीं होता है, तो आपको नीचे की तरह एक कंपाइलर त्रुटि मिल सकती है।

 #include <iostream> template <class T> class Dependent { protected: T data; }; template <class T> class OtherDependent : public Dependent<T> { public: void printT()const { std::cout << "T: " << data << std::endl; //ERROR } }; int main() { OtherDependent<int> o; o.printT(); return 0; } 

यह त्रुटि इसलिए होती है क्योंकि कंपाइलर बेस क्लास टेम्पलेट के अंदर name पता नहीं लगाएगा क्योंकि यह T पर निर्भर नहीं है और इसके परिणामस्वरूप, यह एक डिफेन्ड नाम नहीं है। तय करने के तरीके, इसका उपयोग कर रहे हैं या निर्भर बेस क्लास टेम्पलेट को स्पष्ट रूप से बता रहे हैं:

 std::cout << "T: " << this->data << std::endl; //Ok now. std::cout << "T: " << Dependent<T>::data << std::endl; //Ok now.