एक उपयोग है जो पहले से ही सी ++ में उल्लेख नहीं किया गया है, और वह स्वयं की वस्तु को संदर्भित नहीं करना है या किसी प्राप्त चर से एक सदस्य की अवहेलना करना है।
आप this
एक गैर-निर्भर नाम को एक तर्क पर निर्भर नाम में परिवर्तित करने के लिए उपयोग कर सकते हैं, जो कि अन्य वर्गों से प्राप्त होने वाले टेम्पलेट वर्गों के अंदर है।
template <typename T>
struct base {
void f() {}
};
template <typename T>
struct derived : public base<T>
{
void test() {
//f(); // [1] error
base<T>::f(); // quite verbose if there is more than one argument, but valid
this->f(); // f is now an argument dependent symbol
}
}
टेम्पलेट्स को दो पास तंत्र के साथ संकलित किया जाता है। पहले पास के दौरान, केवल गैर-तर्क पर निर्भर नाम हल किए जाते हैं और जांचे जाते हैं, जबकि आश्रित नाम केवल सुसंगतता के लिए जांचे जाते हैं, वास्तव में टेम्पलेट तर्कों को प्रतिस्थापित किए बिना।
उस चरण में, वास्तव में प्रकार को प्रतिस्थापित किए बिना, कंपाइलर को लगभग कोई जानकारी नहीं है कि क्या base<T>
हो सकता है (ध्यान दें कि आधार टेम्पलेट की विशेषज्ञता इसे पूरी तरह से अलग प्रकारों, यहां तक कि अपरिभाषित प्रकारों में बदल सकती है), इसलिए यह मान लेता है कि यह एक प्रकार है । इस स्तर पर गैर-आश्रित कॉल f
जो प्रोग्रामर के लिए स्वाभाविक लगती है वह एक प्रतीक है जिसे कंपाइलर को सदस्य के रूप में derived
या नामस्थान को घेरने के लिए खोजना होगा - जो उदाहरण में नहीं होता है - और यह शिकायत करेगा।
समाधान गैर-निर्भर नाम f
को निर्भर नाम में बदल रहा है । यह कुछ तरीकों से किया जा सकता है, स्पष्ट रूप से उस प्रकार को बताते हुए जहां इसे लागू किया गया है (- base<T>::f
जिससे base<T>
प्रतीक निर्भर करता है T
और कंपाइलर केवल यह मान लेगा कि यह मौजूद होगा और दूसरे पास के लिए वास्तविक चेक को स्थगित कर देगा, के बाद तर्क प्रतिस्थापन।
दूसरा तरीका, बहुत अधिक सॉर्टर यदि आप उन टेम्प्लेट से विरासत में लेते हैं जिनमें एक से अधिक तर्क हैं, या लंबे नाम हैं, तो बस this->
प्रतीक से पहले जोड़ रहे हैं । जैसा कि आप जिस टेम्प्लेट क्लास को लागू कर रहे हैं, वह एक तर्क पर निर्भर करता है (यह जिस से विरासत में मिलता है base<T>
) this->
तर्क पर निर्भर है, और हमें एक ही परिणाम मिलता है: this->f
दूसरे दौर में जाँच की जाती है, टेम्पलेट पैरामीटर प्रतिस्थापन के बाद।
this
में MSDN की आवश्यकता होती है तो मुझे अच्छे उदाहरण मिलते हैं । कृपया इस लिंक का अनुसरण करें ... ;-)