[英]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
可以专门用于一些S
, T
将iterator
定义为静态数据成员,成员函数的名称或其他名称。 它是什么,编译器仅在实例化模板时才发现。 因此,您必须向编译器解释iterator
是类型的名称,以帮助编译器。 (很傻,我知道,但是编译器确实如此愚蠢)。 您可以通过把一个做typename
在它的前面:
typename map<const S, Node<T>*>::iterator deleteIterator;
但是,您实际上所做的是错误的。 您无需手动删除地图托管的元素。 但。
您正在使用裸露的哑指针作为地图的引用类型。 谁拥有这些物品? 谁负责删除它们? 您可能需要遍历地图,并且(而不是删除指针)删除这些指针引用的对象。 但这容易出错,并且仍然存在有关对象寿命的悬而未决的问题。 (例如:谁负责从地图上删除的对象?)
我强烈建议您听fnieto的建议 ,改用智能指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.