help-gplusplus
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Access map element wrong using operator []


From: Long Li
Subject: Access map element wrong using operator []
Date: Tue, 31 Jan 2006 22:25:03 -0500

When I compile the following code, there is something wrong about function "f1".  f1 and f2 have the same function, I just use different method to access the single element.  Could you tell me the reason?  Thanks.

Long

====Compiler information====
$ g++ -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-awt=gtk-default --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr --disable-werror --enable-checking=release i486-linux-gnu
Thread model: posix
gcc version 4.0.3 20051201 (prerelease) (Debian 4.0.2-5)

====Code Begin====
#include <iostream>
using std::cout;
using std::endl;
#include <string>
using std::string;
#include <vector>
using std::vector;
#include <map>
using std::map;

class A{
public:
  map<string, vector<string> > MapInA;
};


void f1( const map<string, A> &aaa ){
  map<string, A>::const_iterator it = aaa.begin();
  while( it != aaa.end() ){
    if( it->second.MapInA.count( "ID" ) ){
      cout << (*it).second.MapInA[ "ID" ][ 0 ] << endl;
    }
    it++;
  }
}

void f2( const map<string, A> &aaa ){
  map<string, A>::const_iterator it = aaa.begin();
  map<string, vector<string> >::const_iterator it2;
  while( it != aaa.end() ){
    if( it->second.MapInA.count( "ID" ) ){
      it2 = it->second.MapInA.find( "ID" );
      cout << it2->second[ 0 ];
    }
    it++;
  }
}

int main(){
  A a;
  a.MapInA[ "ID" ].push_back( "001" );

  map<string, A> MapInMain;
  typedef map<string, A>::value_type MapElement;
  MapInMain.insert( MapElement( "key1", a ) );
  f1( MapInMain );
  f2( MapInMain );
}
====Code End====

====Errro Message====
$ g++ map.cpp
map.cpp: In function 'void f1(const std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, A, 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> >, A> > >&)':
map.cpp:21: error: passing 'const std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, 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> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >' as 'this' argument of '_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >]' discards qualifiers


reply via email to

[Prev in Thread] Current Thread [Next in Thread]