Вложенные шаблоны с зависимой областью действия - PullRequest
79 голосов
/ 22 июля 2010

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

123 голосов
/ 22 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...