C ++ list <T>:: iterator нельзя использовать в шаблоне производного класса - PullRequest
5 голосов
/ 29 марта 2010

g ++ компилятор выдаёт эту ошибку: ожидается `; 'до 'это'

template <typename T>
class myList : public std::list<T>
{   
public:

  void foo () 
  { 
    std::list<T>::iterator it;       // compiler error as above mentioned, why ???
  }
};

Спасибо.

Ответы [ 2 ]

14 голосов
/ 29 марта 2010

в г ++. всякий раз, когда в шаблоне вы видите ошибку:

error: expected ';' before 'it'

подозреваю, что вам нужно имя типа:

typename std::list<T>::iterator it;  

Это необходимо, когда в шаблоне объявлен новый тип (в данном случае итератор списка), который зависит от одного или нескольких параметров шаблона. Потребность не уникальна для g ++, кстати, это часть стандарта C ++.

10 голосов
/ 29 марта 2010

Нейл дал тебе ответ. Тем не менее, вы, возможно, захотите убить typedef и использовать их, чтобы ваша работа не стала такой утомительной (и это повышает читабельность):

template <typename T>
class myList : public std::list<T>
{   
public:
    typedef T value_type;
    typedef const T const_value_type;
    typedef value_type& reference;
    typedef const_value_type& const_reference;
    typedef value_type* pointer;
    typedef const_value_type* const_pointer;

    typedef std::list<T> base_container;
    typedef typename base_container::iterator iterator;
    typedef typename base_container::const_iterator const_iterator;

    void foo () 
    { 
        iterator it; // easy peasy
    }
};

Весьма распространено быть либеральным при использовании typedef.

Кроме того, наследование от стандартного контейнера может быть плохой идеей, поскольку они на самом деле не созданы для такой вещи. Например, бесплатная функция часто лучший выбор , если вы ищете некоторые расширения для контейнера.

...