2011-07-21 49 views
1

以下代碼STL地圖編譯問題據說可與2008年VS但我有圍繞線53 麻煩其中:C++與GCC /碼塊

portMap_.erase(it); 

我使用的碼塊/ MingW平臺/ GCC 4。 XX

#include<iostream> 
#include<map> 
#include<string> 

using namespace std; 

//defining a union that is used with newMap_ 
union uu 
{ 
    char c; 
    int i; 
} u; 

//Lets define two different maps 
//The first parameter is key and second value 
map<string, int> portMap_; 
map<void *, uu> newMap_; 

int main() 
{ 
    //first entry in portmap 
    portMap_["first"] = 1; 

    //example of using the iterator 
    map<string, int>::const_iterator it; 
    string z = "second"; 
    it = portMap_.find(z); //not in the map so wont be found 
    if(it == portMap_.end()) 
    { 
    portMap_[z] = 22; //add second element 
    } 

    //Add thrid element directly 
    z = "third"; 
    portMap_[z] = 12345; 

    //Add 4th element by insert 
    portMap_.insert(pair<string,int>("fourth", 4444)); 

    //Add 5th element by insert 
    portMap_.insert(pair<string,int>("fifth", 5555)); 


    cout<<"\n** Printing the portmap_ values **"<<endl; 
    for(it = portMap_.begin(); it != portMap_.end(); ++it) 
    cout<<"Key = "<<it->first<<" Val = "<<it->second<<endl; 

    cout<<"\n** Removing fourth element **"<<endl; 
    z = "fourth"; 
    it = portMap_.find(z); 
    portMap_.erase(it); 

    cout<<"\n** Printing the portmap_ values **"<<endl; 
    for(it = portMap_.begin(); it != portMap_.end(); ++it) 
    cout<<"Key = "<<it->first<<" Val = "<<it->second<<endl; 

    //Playing with New Map 
    cout<<"\n\nCreating New Map whose key is a void pointer"<<endl; 

    uu u_val1, u_val2; 
    void *val1, *val2; 
    u_val1.i = 70, val1 = &u_val1; 
    newMap_[val1]=u_val1; 

    val2 = val1; 
    map<void *, uu>::const_iterator it_new; 
    it_new = newMap_.find(val2); 
    if(it_new != newMap_.end()) 
    { 
    u_val2 = it_new->second; 
    cout<<"Note that since u_val2 is a union you can print i or c as required"<<endl; 
    cout<<"val2 = "<<val2<<" value.c = "<<u_val2.c<<endl; 
    cout<<"val2 = "<<val2<<" value.i = "<<u_val2.i<<endl; 
    } 

    return 0; 
} 

繼承人的錯誤:

map_example\map_example.cpp||In function 'int main()':| 
map_example\map_example.cpp|51|error: no matching function for call to 'std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> > >::erase(std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> >&)'| 
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_map.h|566|note: candidates are: void std::map<_Key, _Tp, _Compare, _Alloc>::erase(typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = int, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char,| 
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_map.h|581|note:     typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::size_type std::map<_Key, _Tp, _Compare, _Alloc>::erase(const _Key&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = int, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_stri| 
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_map.h|596|note:     void std::map<_Key, _Tp, _Compare, _Alloc>::erase(typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator, typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator) [with _Key = std::basic_string<char, std::char_traits<char>, std::all| 
||=== Build finished: 1 errors, 0 warnings ===| 
+0

如果我沒有弄錯,你的代碼應該在C++ 0x中可以。只是當前庫規範中的一個缺陷。 – UncleBens

回答

2

嘗試改變從map<string, int>::const_iterator it;map<string, int>::iterator it

+0

或者只是調用'portmap_.erase(「fourth」);'。 –

4

你的迭代器被定義爲const。嘗試一個非const的迭代器。

您還可以通過簡單地使用key_type來擦除元素。在你的例子中,它會是:

portMap_.erase(z); 
+0

嚴格地說,迭代器不是「被定義爲const」,而是它是一個非const常量迭代器。另外,C++ 0x緩解了這個問題,並允許const迭代器yay進行擦除。 –