2011-07-19 14 views
1
void destroy() 
{ 
    AList::const_iterator a; 
    for(a = AList.begin(); a != AList.end();) 
    { 
     if(!a->second.BList.empty()) 
      a->second.BList.clear();//will give error if not mutable 
    } 
} 
typedef std::map<unsigned int,int> bmap; 
typedef std::map<unsigned int,someStruct> Alist; 
typedef struct someStruct 
{ 
    float x,y,z; 
    bmap BList; //needs to be mutable for Blist.clear() above. 
    //mutable bmap BList; //<---like this 
} someStruct; 

私は、類似しているが同じ質問ではなく、オプションとしてmutableを横断しました。私の質問は私が正しいことをしているか、そうすることに落とし穴があるかどうかです。事前にあなたの助けをありがとう。Map in Map Map.Clear()error

//error given: (if otherwise not mutable) 
// error: passing 'const AList' as 'this' argument of 'void std::map<_Key, _Tp, _Compare, _Alloc>::clear() [with _Key = unsigned int, _Tp = int, _Compare = std::less<unsigned int>, _Alloc = std::allocator<std::pair<const unsigned int, int> >]' discards qualifiers 

答えて

1

あなたの意図がclearを呼び出すことである場合は、iterator代わりのconst_iteratorを使用する必要があります。 const_iteratorは、メンバー関数constだけを呼び出す場合に使用します。

mutableは、この状況には適していません。オブジェクトの可視状態の一部でない場合(例えば、キャッシュされたデータ)、メンバ変数mutableをマークするだけです。

+0

Chrisに感謝します。私はコードをあまりにも長く見つめていて、イテレータを当然としていたと思います。 「可視状態」の意味がわかりません。私はとにかく変更可能なものに精通していない、ちょうど別のポストがconstだったものを解決するためにそれを使用して、ちょうど私のために働いたが、もちろん私はこの質問をした。 – Tyhja

1

シンプルに入れてみましたか?iterator

AList::iterator a; 

const_iteratorは、メンバーが変更可能にすることはできません(いくつかのものを通常の文脈でconstのように)。

+0

あなたの答えをありがとう、私は少しだけ明確だったので、私はクリスの答えを取った。 :) – Tyhja

0

あなたの指定したコードが正しくありません。 destroyはクラスのconstメンバでなければなりませんが、グローバル関数として表示しています。/destroyがconstメソッドの場合、clearは機能しません。

+0

あなたの答えをありがとう。破壊はクラスのメンバーであり、私の場合は破壊してはいけませんが、私はそれが不明であると受け入れます。しかし、上記のように問題は解決されました。ありがとう:) – Tyhja