Ваша непосредственная проблема заключается в том, что map<const S, Node<T>*>::iterator
является так называемым зависимым именем : оно зависит от аргументов шаблона и, теоретически, для некоторых * 1005 может быть специализация std::map
*, T
, который определяет iterator
как статический член данных, имя функции-члена или что-то еще. Что это такое, компилятор узнает только при создании экземпляра вашего шаблона. Поэтому вы должны помочь компилятору, объяснив ему, что iterator
- это имя типа. (Глупо, я знаю, но компиляторы действительно такие глупые). Вы делаете это, помещая typename
перед ним:
typename map<const S, Node<T>*>::iterator deleteIterator;
Однако то, что вы на самом деле делаете, неправильно. Вам не нужно вручную удалять элементы вашей карты хостов. Но.
Вы используете голые, тупые указатели в качестве ссылочного типа карты. Кому принадлежат эти объекты? Кто несет ответственность за их удаление? Возможно, вам придется просмотреть вашу карту и (вместо удаления указателей) удалить объекты, на которые ссылаются эти указатели. Но это подвержено ошибкам и все еще оставляет открытые вопросы относительно времени жизни объекта. (Например: кто несет ответственность за объекты, удаленные с карты?)
Я настоятельно рекомендую вам следовать совету fnieto и использовать вместо этого умный указатель.