आश्रित गुंजाइश के साथ नेस्टेड टेम्पलेट


79

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

$ 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;
}

जवाबों:


124

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

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

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

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


6
ठीक है, लेकिन क्या यह सच नहीं है कि यह एक सदस्य चर को टाइप करने के लिए कोई मतलब नहीं है?
user383352

5
हां, लेकिन यह जरूरी नहीं कि कुछ विवरणों के कारण यह मदद करता है कि कैसे संकलक द्वारा पार्स किए गए हैं। इस प्रश्न का स्वीकृत उत्तर देखें: stackoverflow.com/questions/642229/…
टायलर मैकहेनरी

5
पहली बार इस त्रुटि और अवधारणा के सामने आने पर मुझे यह उत्तर बहुत उपयोगी लगा।
ड्रू नोक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.