2010-07-22 4 views
76

Что такое зависимая область действия и каково значение typename в контексте следующей ошибки?Вложенные шаблоны с зависимой областью

$ 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

Компилятор рассказал вам, что именно делать. Написать 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

Да, но это не обязательно поможет из-за некоторых подробностей о том, как шаблоны анализируются компилятором. См. Принятый ответ на этот вопрос: 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), чтобы быть очень полезной при первой встрече с этой ошибкой и концепцией. –

Смежные вопросы