2012-12-19 15 views
6

बस कुछ ऐसी चीज पर ठोकर खाई जो मैं समझा नहीं सकता। निम्नलिखित कोडकभी-कभी इसका उपयोग आवश्यक है?

template<int a> 
class sub{ 
protected: 
    int _attr; 
}; 

template<int b> 
class super : public sub<b>{ 
public: 
    void foo(){ 
     _attr = 3; 
    } 
}; 

int main(){ 
    super<4> obj; 
    obj.foo(); 
} 

जबकि जब मैं बदल _attr = 3;this->attr = 3; लिए वहाँ कोई समस्या नहीं हो रहा है संकलन नहीं है।

वह क्यों है? क्या इसका कोई उपयोग करने के लिए आपको कोई समस्या है?

मैं g++ test.cpp -Wall -pedantic इस्तेमाल किया संकलित करने के लिए और मैं निम्नलिखित त्रुटि मिलती है

test.cpp: in member function 'void super<b>::foo()': 
test.cpp:11:3: error: '_attr' was not declared in this scope 
+3

[दो चरण नाम लुकअप] (के बारे में पढ़ें http://blog.llvm.org/2009/12/dreaded-:

एक और बहुत सामान्य कारण उपयोग करने के लिए अस्पष्टता समस्याओं को हल करने है दो चरण-नाम-lookup.html)। (यह भी अक्सर पूछे जाने वाले प्रश्न: [मुझे त्रुटियां क्यों मिल रही हैं जब मेरा टेम्पलेट-व्युत्पन्न-वर्ग उस सदस्य का उपयोग करता है जो इसे अपने टेम्पलेट-बेस-क्लास से प्राप्त करता है?] (Http://www.parashift.com/c++-faq/nondependent-name -lookup-members.html)) – ildjarn

उत्तर

7

Why is that? Are there any cases you must to use this?

हाँ, वहाँ कुछ मामलों जहां this उपयोग करने की आवश्यकता है। आपके उदाहरण में, जब संकलक _attr देखता है, तो यह कक्षा के अंदर _attr देखने की कोशिश करता है और इसे नहीं ढूंढ सकता। this-> जोड़कर देरी तत्काल समय तक लुकअप करें जो संकलक को sub के अंदर ढूंढने की अनुमति देता है।

void foo (int i) 
{ 
    this->i = i; 
} 
+0

धन्यवाद। अस्पष्टता के उपयोग के बारे में पता था लेकिन यह नया है ... – Ace7k3