2011-07-19 98 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; 

我只是在類似但不是相同的問題中出現了一個可變選項。我的問題是我做的是正確的事情,還是有這樣的缺陷?提前謝謝你的幫助。Map in 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

您應該使用iterator代替const_iterator,如果你的目的是呼籲clearconst_iterator適用於只撥打const成員功能的情況。使用mutable不適合這種情況。如果成員變量mutable不屬於對象的可見狀態(例如緩存數據),則僅標記成員變量mutable

+0

感謝克里斯,我想我盯着代碼太長,並認爲是理所當然的迭代器。 我不太清楚你的意思是「可見狀態」。我並不熟悉mutable,它只是另一篇文章用它來解決const的一些問題,它只是爲我工作,但當然這就是我問這個問題的原因。 – Tyhja

1

您是否嘗試了簡單的iterator

AList::iterator a; 

const_iterator不允許成員可修改(有些什麼樣的const在正常情況下)。

+0

謝謝你的回答,我帶着克里斯的回答,因爲它只是稍微清晰一些。 :) – Tyhja

0

您給出的代碼不正確。 destroy應該是類的常量成員,但是您已將其顯示爲全局函數。由於/如果destroy是常量方法,clear將不起作用。

+0

謝謝你的回答。 Destroy是一個階級的成員,在我的情況下,摧毀不應該是恆定的,但我接受它並不清楚。但是,如上所述解決了這個問題。謝謝 :) – Tyhja