2011-02-07 22 views
7

संभावित डुप्लिकेट:
[FAQ]Why doesn't a derived template class have access to a base template class' identifiers? Problem with protected fields in base class in c++
cannot access data member in a class templateसी ++ टेम्पलेट वर्ग और विरासत

कोड के बाद मुझे संकलन त्रुटि देता है। गलत क्या है?

struct Base { 
    int amount; 
}; 

template<class T> struct D1 : public Base { 
}; 

template<class T> 
struct D2 : D1<T> { 
    void foo() { amount=amount*2; /* I am trying to access base class data member */ }; 
}; 

int main() { 
    D2<int> data; 
}; 


test.cpp: In member function 'void D2<T>::foo()': 
test.cpp:11: error: 'amount' was not declared in this scope 

इसे कैसे ठीक करें?

धन्यवाद

+0

मैंने इस प्रश्न को कई बार पहले देखा है लेकिन मुझे कोई लिंक नहीं मिल रहा है। –

+0

एक मिला, हालांकि अगर कोई एक बेहतर प्रश्न के साथ एक को ढूंढ सकता है जो बहुत अच्छा होगा: [सी ++ में बेस क्लास में संरक्षित फ़ील्ड में समस्या] (http://stackoverflow.com/questions/1813671/problem-with- संरक्षित- फ़ील्ड-इन-बेस-क्लास-इन-सी) –

+2

@ क्रिस: यहां एक [डुप्लिकेट] है (http://stackoverflow.com/questions/4210108/cannot-access-data-member-in-a-class-template) , और यहां एक [लंबा स्पष्टीकरण] है (http://stackoverflow.com/questions/4643074/why-do-i-have-to-access-template-base-class-members-through-the-this- सूचक)। – GManNickG

उत्तर

8

समस्या यहाँ कैसे नाम टेम्पलेट वर्गों कि टेम्पलेट आधार वर्ग से विरासत में देखा जाता है के साथ क्या करना है। इसके पीछे वास्तविक नियम सुंदर आर्केन हैं और मैं उन्हें अपने सिर के ऊपर से नहीं जानता; मुझे आमतौर पर यह जानने के लिए एक संदर्भ से परामर्श करना पड़ता है कि यह क्यों काम नहीं करता है।

void foo() { 
    this->amount = this->amount * 2; // Or: this->amount *= 2; 
} 

इस संकलक जहां नाम amount से आता है और संकलक त्रुटि को हल करना चाहिए के बारे में एक स्पष्ट संकेत देता है:

तरह से इसे ठीक करने के लिए स्पष्ट रूप सदस्य उपसर्ग के लिए आप this-> साथ प्रवेश कर रहे होते है।

यदि कोई यह त्रुटि उत्पन्न करता है तो यह एक और विस्तृत विवरण देना चाहता है कि मुझे एक अच्छा स्पष्टीकरण देखना अच्छा लगेगा।

+1

त्रुटि का कारण यह है कि संकलक बेस क्लास के आंशिक विशेषज्ञता के मामले में टेम्पलेट बेस क्लास सदस्यों के बारे में कोई धारणा नहीं करता है जिसमें इनमें से कुछ सदस्यों को शामिल नहीं किया गया है। – Gorpik

+0

धन्यवाद। यह काम करता हैं! – anon

+0

[इस] के अनुसार (http://www.hackcraft.net/cpp/templateInheritance/): "आधार के बारे में ध्यान देने योग्य एक दिलचस्प बात यह है कि टी के प्रकार के बाद तक इसका कोई भी सदस्य फ़ंक्शन नहीं बनाया जाता है।" तो संकलक किसी भी सदस्यों के बारे में परिभाषा समय पर नहीं जानता, केवल कार्यों के लिए। – jswolf19

संबंधित मुद्दे