Неспособность использовать контейнеры stl в шаблонных функциях / классах - PullRequest
2 голосов
/ 09 мая 2009

Когда я пытаюсь скомпилировать следующий код ...

#include <vector>

template <class T> void DoNothing()
{
    std::vector<T>::iterator it;
}

int main(int argc, char**argv)
{
    return 0;
}

г ++ говорит:

test.cpp: 5: ошибка: ожидается `; ' до «Это»

И я не понимаю, почему это проблема. Если я заменю его на std::vector<int>::iterator, скажем, он работает нормально, как и ожидалось.

Как видите, я не создаю экземпляр этой функции, поэтому у g ++ должна быть проблема с самим определением шаблона, но я не вижу, насколько он недействителен.

Спасибо за любой совет о том, что происходит.

NB. На самом деле я пытаюсь написать шаблонный класс и у меня проблемы с картой, а не с вектором, но это самый простой тест для моей проблемы.

Ответы [ 3 ]

7 голосов
/ 09 мая 2009

Вам необходимо использовать ключевое слово typename, поскольку тип std::vector<T>::iterator зависит от параметра шаблона:

template <class T> void DoNothing()
{
    typename std::vector<T>::iterator it;
}

Это может на самом деле сбить с толку, когда вам нужно использовать typename и когда вам это не нужно (или даже не разрешено использовать). Эта статья имеет достойный обзор:

1 голос
/ 09 мая 2009

Я согласен, что это сбивает с толку. Без ключевого слова typename имя будет считаться статическим членом. В книге C ++ Templates Вандевурда и Йосуттиса это подробно объясняется.

0 голосов
/ 09 мая 2009

Работает ли typename std::vector<T>::iterator it;?

РЕДАКТИРОВАТЬ: изменить template на typename ... перепутал мои ключевые слова.

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