Изменение:
MyList::iterator it;
к:
typename MyList::iterator it;
Я считаю, что это имеет отношение к компилятор не будучи уверенным в том, следует ли MyList::iterator
быть значение некоторого вида (скажем, что iterator
был статическим членом MyList
) или типа. typename
заставляет последний (правильный) вариант.
Я считаю, что соответствующий стандарт цитирует начинается здесь, второй 14,6:
имя, используемое в шаблоне предполагается не назвать тип, если это применимо именем поиск не находит имя типа или имя квалифицируется ключевое слово typename
.
Таким образом, вы должны выяснить, что «применимо имя поиска» есть, но стандарт также следит за этим примером:
// no B declared here
class X;
template<class T> class Y {
class Z; // forward declaration of member class
void f() {
X* a1; // declare pointer to X
T* a2; // declare pointer to T
Y* a3; // declare pointer to Y<T>
Z* a4; // declare pointer to Z
typedef typename T::A TA;
TA* a5; // declare pointer to T’s A
typename T::A* a6; // declare pointer to T’s A
T::A* a7; // T::A is not a type name:
// multiply T::A by a7
B* a8; // B is not a type name:
// multiply B by a8; ill-formed,
// no visible declaration of B
}
};
Да вы что-то не хватает: главный., Говоря нам, что ошибка компилятора. :) –
@Steve: Нет, компилятор не имеет значения, кроме того, что g ++ неправильно принимает код. –
Да, извините, что. Ред. –