g ++ компилятор дает эту ошибку: ожидаемый''; перед 'ним'
template <typename T>
class myList : public std::list<T>
{
public:
void foo ()
{
std::list<T>::iterator it; // compiler error as above mentioned, why ???
}
};
Спасибо.
В g ++. всякий раз, когда в шаблоне вы видите ошибку:
error: expected ';' before 'it'
подозреваете, что вам нужно имя типа:
typename std::list<T>::iterator it;
Это необходимо, когда в шаблоне объявлен новый тип (в данном случае итератор списка), который зависит от одного или нескольких из параметры шаблона. Необходимость не является уникальной для g ++ BTW, это часть стандартного C ++.
Нейл дал вам ваш ответ. Тем не менее, вы, возможно, захотите создать множество 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.
Кроме того, наследование от стандартного контейнера может быть плохой идеей, поскольку на самом деле они не предназначены для этого. Например, бесплатная функция часто лучший выбор , если вы ищете какие-то расширения для контейнера.