Ваши ошибки компилятора точно объясняют, что происходит:
И я получаю предупреждение:
Severity Code Description Project File Line
Warning C4346 iterator': dependent name is not a type.
И ошибка:
Severity Code Description Project File Line
Error C2061 syntax error: identifier 'iterator'.
Компилятор не знает, является ли vec<T>::iterator
member variable
из vec<T>
или nested type
.
Мы должны использовать typename
для удаления этой неоднозначности как пользователя Raindrop7
показал в своем ответе.Они показали вам, как исправить ошибку компилятора, где я объяснил, почему вы ее получаете.
Без typename
код будет генерировать неоднозначный код!
С функцией вне классабыть таким, как есть:
template<class T>
vec<T>::iterator vec<T>::begin() {
vec<T>::iterator tmp;
tmp.elem = elem;
return tmp;
}
Вот почему оно вызывает двусмысленность:
Вы имели в виду:
vec<t>::iterator as in
template<typename T>
class vec {
public:
T iterator;
};
Или
vec<t>::iterator as in
template<typename T>
class vec {
public:
struct iterator {
};
};
В связи с тем, что iterator
является class
или struct
, необходимо define
как type
, и именно здесь typename
входит виграть.Это позволяет компилятору разрешить ambiguity
, давая компилятору подсказку, что iterator
является type
, а не member
.Таким образом, это заставит компилятор использовать это:
template<typename T>
class vec {
public:
struct iterator {
};
};
вместо этого:
template<typename T>
class vec {
public:
T iterator;
};
Здесь - это еще один Q/A
, который мог бы произвести аналогичноеошибка компилятора.