Вкладені шаблони із залежним обсягом


79

Що таке залежний обсяг і яке значення 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;
}

Відповіді:


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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.