0

マップを反復して消去するイテレータを定義しようとしています(デストラクタ)
エラーが発生します:互換性のないイテレータ。

私のデストラクタは次のようになります:

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;  

助言がありますか?

4

2 に答える 2

2

map<const S, shared_ptr<Node<T> > >代わりに使用してください。

于 2010-09-20T09:34:52.837 に答える
1

あなたの当面の問題はmap<const S, Node<T>*>::iterator、それがいわゆる従属名であるということです:それはテンプレート引数に依存し、理論的にはstd::mapS静的Tデータiteratorメンバー、メンバー関数の名前、またはなんでもいい。それが何であるか、コンパイラはテンプレートをインスタンス化するときにのみ検出します。iteratorしたがって、型の名前であると説明することによってコンパイラを支援する必要があります。(愚かなことは知っていますが、コンパイラーは本当にばかげています)。あなたはそれの前に置くことによってそれをしtypenameます:

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

しかし、あなたが実際にやっていることは間違っています。マップがホストする要素を手動で削除する必要はありません。だが。

マップの参照タイプとして、裸のダムポインタを使用しています。これらのオブジェクトの所有者は誰ですか?それらを削除する責任は誰にありますか?マップを調べて、(ポインターを削除する代わりに)これらのポインターによって参照されるオブジェクトを削除する必要がある場合があります。しかし、それはエラーが発生しやすく、オブジェクトの存続期間に関する未解決の質問が残っています。(例:マップから削除されたオブジェクトの責任は誰にありますか?)fnietoのアドバイスに従い、代わりにスマートポインターを使用する
ことを強くお勧めします。

于 2010-09-20T10:45:02.193 に答える