Это объявляет iterator
переменной (не типом):
typename std::vector<std::pair<T1,T2> >::iterator iterator;
Вы имели в виду это?
typedef typename std::vector<std::pair<T1,T2> >::iterator iterator;
Дополнительная информация: Если вам интересно, что делает typename
, ознакомьтесь с различиями между зависимыми и независимыми именами. Если ваш тип тесно связан с конкретным контейнером, typedef этого контейнера может быть полезен, так как шаблон STL использует много вложенных typedef, к которым вы можете легко получить доступ (V::value_type
ниже). Это дает дополнительное преимущество: требуется меньше изменений по мере развития вашего кода, например, использование другого распределителя (второй параметр шаблона для вектора) требует только одного редактирования.
template<class T1, class T2>
struct A {
private:
// you may or may not want to expose these convenience types
typedef std::pair<T1, T2> P;
typedef std::vector<P> V;
public:
typedef typename V::value_type value_type;
typedef typename V::iterator iterator;
std::pair<iterator, bool> foo(value_type const& value_in);
};