2012-06-17 95 views
1

我看過類似的問題,但我根本看不出什麼問題。 我試過:: const_iterator。但是gcc不會以任何方式進行編譯。標準:地圖不匹配運營商=

它是關於:i = allFunctions.erase(i);

void removeEventListener(const std::string &type, function listener){ 
    if(!hasEventListener(type)) 
     return; 

    std::map<int, std::list<function> > &allFunctions = eventHandlerList[type]; 
    std::map<int, std::list<function > >::iterator i; 

    for(i=allFunctions.begin(); i!=allFunctions.end(); ++i) 
    { 
     i->second.remove(listener); 

     if(i->second.empty()) 
     { 
      i = allFunctions.erase(i); 

     } 
    } 

    if(allFunctions.empty()) 
     eventHandlerList.erase(type); 
} 

誤差常量性:

Error: passing const std::list<void (*)(const st::event::Event&)> as 
this argument of void std::list<_Tp, _Alloc>::remove(const 
value_type&) [with _Tp = void (*)(const st::event::Event&), _Alloc = 
std::allocator<void (*)(const st::event::Event&)>, std::list<_Tp, 
_Alloc>::value_type = void (*)(const st::event::Event&)] discards qualifiers [-fpermissive] 

Error: no matching function for call to std::map<int, std::list<void 
(*)(const st::event::Event&)> >::erase(std::map<int, std::list<void 
(*)(const st::event::Event&)> >::const_iterator&) 

誤差的迭代器:

no match for operator= in i = (& allFunctions)->std::map<_Key, _Tp, _Compare, _Alloc>::erase [with _Key = int, _Tp = std::list<void (*)(const st::event::Event&)>, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, std::list<void (*)(const st::event::Event&)> > >, std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const int, std::list<void (*)(const st::event::Event&)> > >](i) 

有什麼建議?

+0

什麼是eventHandlerList定義爲? –

+0

std :: map >> eventHandlerList; 雖然函數是一個函數指針的typedef – Sidar

+1

這是在C++ 11嗎? –

回答

3

試試這個一般關聯容器擦除循環:

for (std::map<int, std::list<function> >::iterator it = allFunctions.begin(); 
    it != allFunctions.end(); /* no increment! */) 
{ 
    it->second.remove(listener); 

    if (it->second.empty()) { allFunctions.erase(it++); } 
    else     { ++it;      } 
} 

C++ 11改變了簽名和返回的成員 - erase功能類型,然後你可以有一個單行it = allFunctions.erase(it);

+0

奇怪的是,對於std :: lists,它工作得很好。 但你的代碼似乎工作。謝謝。也許我應該用一段時間來代替。 – Sidar