2010-07-22 13 views
76

निर्भर दायरा क्या है और निम्न त्रुटि के संदर्भ में टाइपनाम का अर्थ क्या है?आश्रित टेम्पलेट्स पर निर्भर स्कोप

$ make 
g++ -std=gnu++0x main.cpp 
main.cpp:18:10: error: need 'typename' before 'ptrModel<std::vector<Data> >::Type' because 'ptrModel<std::vector<Data> >' is a dependent scope 
make: *** [all] Error 1 


/* 
* main.cpp 
*/ 

#include <vector> 
#include <memory> 

template<typename T> 
struct ptrModel 
{ 
typedef std::unique_ptr<T> Type; 
}; 


template<typename Data> 
struct ptrType 
{ 
typedef ptrModel< std::vector<Data> >::Type Type; 
}; 

int main() 
{ 
return 0; 
} 

उत्तर

118

कंपाइलर ने आपको बिल्कुल बताया कि क्या करना है। ptrModel<std::vector<Data> >::Type से पहले लिखें typename, इसलिए जैसे:

typedef typename ptrModel<std::vector<Data> >::Type Type; 

इस आवश्यकता के लिए कारण संकलक इस बिंदु पर नहीं पता है कि ptrModel<std::vector<Data> >::Type एक सदस्य चर या एक नेस्टेड प्रकार का वर्णन करता है कि क्या है। यह ptrModel की परिभाषा को देखकर इसे भी समझ नहीं सकता है क्योंकि के लिए std::vector<Data> के लिए प्रोग्राम में कहीं और विशेषज्ञता हो सकती है, जो कि अभी तक नहीं मिला है, जो इन चीजों में से कौन सा परिवर्तन ::Type को संदर्भित करता है। तो आपको इसे स्पष्ट रूप से बताना होगा।

नाम ptrModel<std::vector<Data> >::Type का नाम "आश्रित क्षेत्र" है क्योंकि यह एक दायरे में है कि एक टेम्पलेट के तत्काल पर पर निर्भर करता है।

+6

ठीक है, लेकिन क्या यह सच नहीं है कि यह एक सदस्य चर टाइपिफ़ को समझ में नहीं आता है? – user383352

+5

हां, लेकिन यह आवश्यक नहीं है कि संकलक द्वारा टेम्पलेट को कैसे पार्स किया जाता है, इसके बारे में कुछ विवरणों के कारण मदद नहीं करता है। इस प्रश्न के स्वीकृत उत्तर को देखें: http://stackoverflow.com/questions/642229/why-do-i-need-to-use-typedef-typename-in-g-but-not-vs –

+5

मुझे यह भी मिला [ यह उत्तर] (http://stackoverflow.com/a/6571836/24874) पहली बार इस त्रुटि और अवधारणा में आने पर बहुत उपयोगी होने के लिए। –

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