Список C++ <T>:: наклон итератора использоваться в шаблоне производного класса

g ++ компилятор дает эту ошибку: ожидаемый''; перед 'ним'

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

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

Спасибо.

5
задан Georg Fritzsche 6 April 2010 в 02:46
поделиться

2 ответа

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

error: expected ';' before 'it'

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

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

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

15
ответ дан 18 December 2019 в 06:22
поделиться

Нейл дал вам ваш ответ. Тем не менее, вы, возможно, захотите создать множество 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.

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

10
ответ дан 18 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: