繁体   English   中英

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

[英]How to define an iterator in a template?

我正在尝试定义一个迭代器来迭代我的地图以将其删除(析构函数)
我遇到一个错误:迭代器不兼容。

我的析构函数如下所示:

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;  

有什么建议么?

请改用map<const S, shared_ptr<Node<T> > >

您的直接问题是map<const S, Node<T>*>::iterator是所谓的从属名称 :它取决于模板参数,理论上, std::map可以专门用于一些STiterator定义为静态数据成员,成员函数的名称或其他名称。 它是什么,编译器仅在实例化模板时才发现。 因此,您必须向编译器解释iterator是类型的名称,以帮助编译器。 (很傻,我知道,但是编译器确实如此愚蠢)。 您可以通过把一个做typename在它的前面:

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

但是,您实际上所做的是错误的。 您无需手动删除地图托管的元素。 但。

您正在使用裸露的哑指针作为地图的引用类型。 谁拥有这些物品? 谁负责删除它们? 您可能需要遍历地图,并且(而不是删除指针)删除这些指针引用的对象。 但这容易出错,并且仍然存在有关对象寿命的悬而未决的问题。 (例如:谁负责从地图上删除的对象?)
我强烈建议您听fnieto的建议 ,改用智能指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM