Необходимо указать параметр шаблона в случае, если он не может быть автоматически выведен (автоматическое c Вывод параметра шаблона в шаблонах классов был введен в C ++ 17).
У вас есть несколько строк, где вы не указывайте параметры шаблона:
MyListItr<T> begin() { return MyListItr(this->head); /* Here you forget semicolon */};
MyList::Node* data;
MyListItr(MyList::Node*data):data(data) {}
Вы должны переписать их следующим образом:
MyListItr<T> begin() { return MyListItr<T>(this->head);};
typename MyList<T>::Node* data;
MyListItr(typename MyList<T>::Node*data):data(data) {}
В первой строке компилятор не может вывести параметр шаблона MyListItr
по типу возвращаемого значения (Я думаю, вы подумали, что если вы указали параметр шаблона в типе возврата, компилятор может «запомнить» его), потому что, например, MyListItr
s с другим параметром шаблона могут быть преобразованы друг в друга ...
В других строках компилятор ничего не знает о MyList
, потому что не совсем понятно, что ваш список и его итератор должны иметь одинаковые параметры шаблона. Это больше о пользовательской семантике.
Вы должны написать typename
во второй и третьей строках, потому что этот тип зависит от параметра шаблона. Вот некоторые объяснения: https://en.cppreference.com/w/cpp/language/dependent_name
Более того, вам лучше переименовать аргумент в следующей строке, поскольку он может конфликтовать с именем параметра шаблона:
bool operator!=(MyListItr<T> const& T_)const;
Кроме того, вы можете попытаться объявить итератор внутри класса вашего списка, и он будет автоматически связывать типы внутри. В этом случае вы также можете скрыть Node
от кода пользователя и объявить его в приватном разделе.