g ++ "не тип" ошибка - PullRequest
       15

g ++ "не тип" ошибка

8 голосов
/ 19 августа 2009

Написание шаблонной функции я объявил:

template <typename T>
T invertible(T const& container, T::size_type startIndex, T::size_type endIndex);

Компиляция с g ++ 4.0.1 Я получил ошибку:

error: 'T::size_type' is not a type

Ответы [ 4 ]

29 голосов
/ 19 августа 2009

Вам нужно добавить имя типа.

т.е.

template <typename T>
T invertible(T const& container, typename T::size_type startIndex, typename T::size_type endIndex);

Не имея никакой информации о вашем типе T, компилятор должен знать, что T :: size_type обозначает тип.

Из стандарта, раздел 14.6.2:

Предполагается, что имя, используемое в объявлении или определении шаблона и зависящее от параметра-шаблона, не называет тип, если только применимый поиск имени не найдет имя типа или имя не будет определено ключевым словом typename.

7 голосов
/ 19 августа 2009

Как вы узнали, T :: size_type должен начинаться с префикса typename. Почему?

Из "Шаблоны C ++: Полное руководство"

Определение языка решает эту проблему, указывая, что в общем случае зависимое квалифицированное имя не обозначает тип, если этому имени не предшествует ключевое слово typename.

... Префикс typename к имени обязателен , когда имя

  1. Появляется в шаблоне
  2. Квалифицирован
  3. Не используется в качестве списка спецификаций базового класса или списка инициализаций членов, представляющих определение конструктора
  4. Зависит от параметра шаблона

Кроме того, префикс typename имеет значение , не допускается , если не выполнены хотя бы первые три предыдущих условия.

3 голосов
/ 19 августа 2009

Поскольку при разборе объявления шаблона T не известен. Таким образом, компилятор не знает, существует ли T :: size_type вообще. Это может относиться к статической переменной, например. Когда вы позже используете шаблон, T, конечно, известен, но ошибка происходит раньше. И, пожалуйста, используйте что-то менее древнее, чем gcc 4.0.1; -)

Edit: Если вы скомпилируете это с -fpermissive, компилятор, вероятно, жует ваш код, но он выдаст предупреждение.

0 голосов
/ 19 августа 2009

Оказалось, что мне нужно было указать, что T :: size_type - это имя типа. Почему это так?

template <typename T>
T invertible(T const& container, typename T::size_type startIndex, typename T::size_type endIndex);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...