Невозможно настроить итератор для std :: map of std :: pair - PullRequest
2 голосов
/ 12 февраля 2012

У меня есть карта со значениями std :: pair.

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

src / DBConnector.cpp: в функции-члене int DBConnector :: createGenericInsert (std :: string, std :: map, std :: pair>, std :: less>, std :: allocator, std :: pair>>>>, std :: string &) ': src / DBConnector.cpp: 354: ошибка: нет соответствия для' operator = 'в' l_oIterEnd = p_mapValues.std :: map <_Key, _Tp, _Compare, _Alloc> ::заканчивается _Key = std :: basic_string, _Tp = std :: pair>, _Compare = std :: less>, _Alloc = std :: allocator, std :: pair>>> '/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> &) [с _Key = std :: basic_string, _Tp = std :: pair>, _Compare = std :: less>, _Alloc = std :: allocator, std :: pair>>>]

Моя функция такая:

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 :: pair?(Кроме того, может ли карта содержать ключи разных типов?)

Ответы [ 2 ]

5 голосов
/ 12 февраля 2012

Вы не правильно назвали тип 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, чтобы получить сопоставленное значение.

4 голосов
/ 12 февраля 2012

это не итераторы.

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;
...