2010-07-22 17 views
76

Bağımlı kapsam nedir ve aşağıdaki hatanın bağlamında typename'nin anlamı nedir?Bağlantılı kapsamı olan iç içe şablonlar

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

cevap

118

Derleyici tam olarak ne yapacağınızı söyledi. böylece gibi ptrModel<std::vector<Data> >::Type önce typename yazın:

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

bu gereksinimi için nedeni derleyici bu noktada ptrModel<std::vector<Data> >::Type üyesi değişkeni veya yuvalanmış türünü açıklar olmadığını bilmiyor olmasıdır. ptrModel tanımına bakarak bu bilestd::vector<Data> için bir özelleştirme olabilir programında başka bir şey olabilir, henüz bu satırlar ::Type bu hangi şeylerin hangi değişiklikleri atladığını henüz almadı. Yani bunu açıkça anlatmalısın. adı ptrModel<std::vector<Data> >::Type adı, 'un bir şablonun başlatılmasına bağlı olduğu bir kapsamda olduğundan, "bağımlı kapsamı" vardır.

+6

Pekala, ama doğru değil, üye değişkeni yazıldığından mantıklı değil mi? – user383352

+5

Evet, ancak bu, şablonların derleyici tarafından nasıl ayrıldığına dair bazı ayrıntılar nedeniyle mutlaka yardımcı olmaz. Bu sorunun kabul edilen cevabına bakın: http://stackoverflow.com/questions/642229/why-do-i-need-to-use-typedef-typename-in-g-but-not-vs –

+5

Ayrıca buldum [ Bu cevap] (http://stackoverflow.com/a/6571836/24874) ilk defa bu hata ve konseptin karşısına geçerken çok yardımcı olacak. –