如何在模板中定义迭代器?

时间:2010-09-20 09:24:10

标签: c++ templates map iterator erase

我正在尝试定义一个迭代器来迭代我的地图来擦除它(析构函数)
我收到一个错误:不兼容的迭代器。

我的析构函数看起来像这样:

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 个答案:

答案 0 :(得分:2)

改为使用map<const S, shared_ptr<Node<T> > >

答案 1 :(得分:1)

你当前的问题是map<const S, Node<T>*>::iterator是一个所谓的依赖名称:它取决于模板参数,理论上可能有{{1}的特化对于某些std::mapS,它将T定义为静态数据成员,成员函数的名称或其他。它是什么,编译器只在实例化模板时发现。因此,您必须通过向其解释iterator是类型的名称来帮助编译器。 (傻,我知道,但编译器确实是那么愚蠢)。你可以在它前面放一个iterator

typename

然而,你实际做的是错的。您无需手动删除地图托管的元素。但。

你使用裸露的哑指针作为地图的引用类型。谁拥有这些物品?谁负责删除它们?您可能需要浏览地图(而不是删除指针)删除这些指针引用的对象。但这容易出错,并且仍然存在关于对象生命周期的开放性问题。 (比如:谁对从地图上删除的物品负责?)
我强烈建议您关注fnieto's advice并使用智能指针代替。