2010-10-17 37 views
0

我遇到問題。我有一個類重載運算符這樣的..使用const重載運算符<但不要插入到映射爲const

class Foo 
{ 
     friend bool operator<(const Foo &a, const Foo &b); 
     ... 
}; 

bool operator<(const Foo &a, const Foo &b) 
{ 
     return a.member < b.member; 
} 

然後在擁有一些FOOS在地圖中鍵一類的功能...

void Bar::Update() 
{ 
     for (FooItr itr = foos.begin(); itr != foos.end();) { 
       FooItr test = itr++; 
       if (!test->first.Check()) { // Check() is const 
         my_map.insert(*test); 
         foos.remove(test); 
       } 
     } 

     for (MapItr itr = my_map.begin(); itr != my_map.end(); ++itr) { 
       itr->first.Update(); // Update is not const 
     } 
} 

,我得到一個錯誤消息像...

error: passing ‘const Foo’ as ‘this’ argument of ‘void Foo::Update()’ discards qualifiers

我相信原因是my_map.insert()被插入常量FOOS,但我不知道如何解決這個問題。

回答

4

即使您不這樣說,map中的鍵總是const。這就是爲了防止編程錯誤。

考慮一下,如果Update改變member會發生什麼 - 在地圖數據結構將在原有基礎上有序,但現在member發生了變化,即排序可能是錯的!地圖將被完全破壞 - 您將無法正確地查找,插入或刪除數據。


所以,一些選項來解決這個問題是:

  • 使用不同的數據結構,它如果對象得到「亂序」沒關係,比如vector
  • 移動在其他地方更新的數據。有時它確實屬於mapped_typemap的第二個模板參數)。有時您可以定義一個新的struct來存儲當前的mapped_type以及需要更改的數據。
  • 如果你正在改變一些不影響類型可觀察狀態的東西,比如緩存,那麼我可能會建議讓更改後的數據成員mutable並使相關成員函數const或將可變數據存儲在scoped_ptr中。但是,名爲Update的函數表明正在更新的數據是該類型的基礎。
+0

+1,我錯過了 - >第一個:vP – Potatoswatter 2010-10-17 02:18:08

+0

啊當然。 Nargh!謝謝。 – random 2010-10-17 02:18:59

+0

那麼問題的完整背景是不存在的,但使用multimap解決它(通過完全避免問題,再次不會進入它)。儘管可能的解決方案。 – random 2010-10-17 02:29:31

相關問題