Вложенные шаблоны с зависимой областью

Что такое зависимая область действия и каково значение 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;
}

Ответ 1

Компилятор рассказал вам, что делать. Напишите typename до ptrModel<std::vector<Data> >::Type, например:

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

Причиной этого требования является то, что компилятор на данный момент не знает, описывает ли ptrModel<std::vector<Data> >::Type переменную-член или вложенный тип. Он даже не может понять это, посмотрев определение ptrModel, потому что для std::vector<Data> может существовать специализация ptrModel в другом месте программы, в котором она еще не получила изменений, какие из этих изменений ::Type означает. Поэтому вам нужно явно указать это.

Имя ptrModel<std::vector<Data> >::Type имеет "зависимую область", поскольку она находится в области, которая зависит от создания шаблона.