2012-02-12 3 views
1

У меня есть карта, значения которой - std :: pair.Невозможно настроить итератор на std :: map std :: pair

Компилятор жалуется следующим образом при попытке установить итератор, но я не могу понять, почему:

src/DBConnector.cpp: In member function ‘int DBConnector::createGenericInsert(std::string, std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<int, 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::pair<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >, std::string&)’: src/DBConnector.cpp:354: error: no match for ‘operator=’ in ‘l_oIterEnd = p_mapValues.std::map<_Key, _Tp, _Compare, _Alloc>::end with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::pair<int, 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::pair<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >’ /usr/include/c++/4.4/bits/stl_map.h:251: note: candidates are: 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>, std::allocator<char> >, _Tp = std::pair<int, 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::pair<int, std::basic_string<char, std::char_traits<char>, 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? (Кроме того, может ли карта содержать клавиши, имеющие разные типы?)

+1

Вы объявляете 'l_oIter' как' std :: map', а не итератором ... – Mat

ответ

4

Вы не назвали тип 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 самих упоминаются как «отображенный тип» , Это важно, потому что многие операции работают с значением, поэтому вам нужно получить доступ к его части, чтобы получить отображаемое значение.

+1

OP: вам также потребуется разыменовать итератор, например. 'l_oIter-> first()' – Joe

+1

@Joe: Спасибо, я даже этого не видел - отредактировал! –

+1

Или, если у вас есть возможности C++ 11, используйте 'auto'. 'auto l_oIterEnd = p_mapValues.end();' –

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; 
Смежные вопросы