ошибка компиляции c ++ - PullRequest
0 голосов
/ 26 июня 2009

Следующий код дает ошибку компиляции в Visual Studio 2009.

#include <iterator>
#include <vector>

template <class T1, class T2 >
class A
{
public:

    typename std::vector<std::pair<T1,T2> >::iterator iterator;
    std::pair<iterator, bool > foo(const std::pair<T1 ,T2> &value_in);
};

Кто-нибудь может пролить свет на это? Вот ошибка.

error C2327: 'A<T1,T2>::iterator' : is not a type name, static, or enumerator

Ответы [ 2 ]

9 голосов
/ 26 июня 2009

Это объявляет 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);
};
0 голосов
/ 26 июня 2009

вам нужен typedef, а не typename

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