[英]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.