我有一张地图,其值为std :: pair。
在尝试设置迭代器时,编译器会抱怨如下,但我无法理解原因:
src / DBConnector.cpp:在成员函数'int中 DBConnector :: createGenericInsert(的std :: string, std :: map< std :: basic_string< char,std :: char_traits< char>, 的std ::分配器<炭> >,std :: pair< int,std :: basic_string< char, std :: char_traits< char&gt ;,std :: allocator< char> > >中 std :: less< std :: basic_string< char,std :: char_traits< char>, 的std ::分配器<炭> > >,std :: allocator< std :: pair< const std :: basic_string< char,std :: char_traits< char&gt ;,std :: allocator< char> >,std :: pair< int,std :: basic_string< char,std :: char_traits< char&gt ;,std :: allocator< char> > > > > >,std :: string&)': src / DBConnector.cpp:354:错误:不匹配'operator ='in 'l_oIterEnd = p_mapValues.std :: map< _Key,_Tp,_Compare,_ Alloc> :: end with _Key = std :: basic_string< char,std :: char_traits< char>, 的std ::分配器<炭> >,_ Tp = std :: pair< int,std :: basic_string< char, std :: char_traits< char&gt ;,std :: allocator< char> > >,_比较= std :: less< std :: basic_string< char,std :: char_traits< char>, 的std ::分配器<炭> > >,_ Alloc = std :: allocator< std :: pair< const std :: basic_string< char,std :: char_traits< char&gt ;,std :: allocator< char> >,std :: pair< int,std :: basic_string< char,std :: char_traits< char&gt ;,std :: allocator< char> > > > >” /usr/include/c++/4.4/bits/stl_map.h:251:注意:候选人是: std :: map< _Key,_Tp,_Compare,_Alloc>& std :: map< _Key,_Tp,_Compare, _Alloc> :: operator =(const std :: map< _Key,_Tp,_Compare,_Alloc>&)[with _Key = std :: basic_string< char,std :: char_traits< char&gt ;,std :: allocator< char> >,_ Tp = std :: pair< int,std :: basic_string< char, std :: char_traits< char&gt ;,std :: allocator< char> > >,_比较= std :: less< std :: basic_string< char,std :: char_traits< char>, 的std ::分配器<炭> > >,_ Alloc = std :: allocator< std :: pair< const std :: basic_string< char,std :: char_traits< char&gt ;,std :: allocator< char> >,std :: pair< int,std :: basic_string< char,std :: char_traits< char&gt ;,std :: allocator< char> > > > >]
我的功能是:
int DBConnector::createGenericInsert ( std::string p_sTable , std::map<std::string , std::pair<int,std::string> > p_mapValues , std::string & po_sInsert ) {
std::map<std::string,std::pair<int,std::string> > l_oIter;
std::map<std::string,std::pair<int,std::string> > l_oIterEnd;
std::string s_Fieldnames;
l_oIterEnd = p_mapValues.end(); // This is line 354
l_oIter = p_mapValues.begin();
s_Fieldnames += l_oIter.first();
...
}
这是什么问题?地图可以包含std :: pairs吗? (此外,地图可以包含持有不同类型的键吗?)
答案 0 :(得分:5)
您没有正确命名类型iterator
!
请请,免除麻烦并使用typedef
:
typedef std::map<std::string, std::pair<int, std::string>> map_type;
int DBConnector::createGenericInsert (std::string p_sTable, map_type p_mapValues,
std::string & po_sInsert)
{
std::string s_Fieldnames;
map_type::iterator l_oIterEnd = p_mapValues.end();
map_type::iterator l_oIter = p_mapValues.begin();
s_Fieldnames += l_oIter->first; // !!
// ...
}
请注意map<A, B>
的值类型实际上是pair<A, B>
,而B
本身被称为“映射类型”。这很重要,因为许多操作都在 value 类型上工作,因此您需要访问它的second
部分才能获得映射值。
答案 1 :(得分:4)
这些不是迭代器。
std::map<std::string,std::pair<int,std::string> > l_oIter;
std::map<std::string,std::pair<int,std::string> > l_oIterEnd;
以上代码应更改为:
std::map<std::string,std::pair<int,std::string> >::iterator l_oIter;
std::map<std::string,std::pair<int,std::string> >::iterator l_oIterEnd;