簡體   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