Как определить итератор в шаблоне? - PullRequest
0 голосов
/ 20 сентября 2010

Я пытаюсь определить итератор для итерации моей карты, чтобы стереть ее (деструктор)
Я получаю сообщение об ошибке: несовместимый итератор.

Мой деструктор выглядит так:

Consortium<S,T>::~Consortium()  
{  
    map<const S, Node<T>*>::iterator deleteIterator;  
    for (m_consortiumMap.begin() ; deleteIterator != m_consortiumMap.end() ; deleteIterator++)  
      m_consortiumMap.erase(deleteIterator);  
}  

Я создаю так:

Consortium<string, Vehicle*> check;  

есть предложения?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2010

Используйте map<const S, shared_ptr<Node<T> > > вместо.

1 голос
/ 20 сентября 2010

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

typename map<const S, Node<T>*>::iterator deleteIterator;

Однако то, что вы на самом деле делаете, неправильно. Вам не нужно вручную удалять элементы вашей карты хостов. Но.

Вы используете голые, тупые указатели в качестве ссылочного типа карты. Кому принадлежат эти объекты? Кто несет ответственность за их удаление? Возможно, вам придется просмотреть вашу карту и (вместо удаления указателей) удалить объекты, на которые ссылаются эти указатели. Но это подвержено ошибкам и все еще оставляет открытые вопросы относительно времени жизни объекта. (Например: кто несет ответственность за объекты, удаленные с карты?)
Я настоятельно рекомендую вам следовать совету fnieto и использовать вместо этого умный указатель.

...