Невозможно повторить плоскую карту

Я работаю с boost flat_map и пытаюсь пройти через него, однако я не могу понять, как создать итератор.

 my_map = mySeg.find<tlsSHMMap>("temp_map").first;   //fetch a pointer to the map
 tlsShmemAllocator alloc_inst (mySeg.get_segment_manager());


 for (boost::container::flat_map<int, tlsStorage, std::less<int>() ,alloc_inst >::const_iterator row = my_map->begin();
 row != my_map->end();
 ++row)
 {
    //do stuff

 }

«tlsStorage» — это структура, которую я использую для хранения данных из базы данных. Плоская карта повышения объявлена ​​​​в другом месте кода следующим образом:

boost::container::flat_map tls_temp_map = mySeg.construct<tlsSHMMap>("temp_map")    (std::less<int>() ,alloc_inst);     //object name

Код, который у меня есть выше, не работает. Вот ошибки, есть идеи?

src/dbm/dbm_shm_server.cc: In member function 'int redcom::dbm::ShmServer::StartServer()':
src/dbm/dbm_shm_server.cc:353:24: warning: unused variable 'tls_main_map' [-Wunused-variable]
             tlsSHMMap* tls_main_map;
                        ^
src/dbm/dbm_shm_server.cc:354:24: warning: unused variable 'tls_temp_map' [-Wunused-variable]
             tlsSHMMap* tls_temp_map;
                        ^
src/dbm/dbm_shm_server.cc: In member function 'void redcom::dbm::ShmServer::fake_notify()':
src/dbm/dbm_shm_server.cc:2023:84: error: the value of 'alloc_inst' is not usable in a constant expression
                 for (boost::container::flat_map<int, tlsStorage, std::less<int>() ,alloc_inst >::const_iterator row = my_map->begin();
                                                                                    ^
src/dbm/dbm_shm_server.cc:2021:40: note: 'alloc_inst' was not declared 'constexpr'
                const tlsShmemAllocator alloc_inst (mySeg.get_segment_manager());
                                        ^
src/dbm/dbm_shm_server.cc:2023:95: error: type/value mismatch at argument 4 in template parameter list for 'template<class Key, class T, class Compare, class Allocator> class boost::container::flat_map'
                 for (boost::container::flat_map<int, tlsStorage, std::less<int>() ,alloc_inst >::const_iterator row = my_map->begin();
                                                                                               ^
src/dbm/dbm_shm_server.cc:2023:95: error:   expected a type, got 'alloc_inst'
src/dbm/dbm_shm_server.cc:2023:113: error: invalid type in declaration before 'row'
                 for (boost::container::flat_map<int, tlsStorage, std::less<int>() ,alloc_inst >::const_iterator row = my_map->begin();
                                                                                                                 ^
src/dbm/dbm_shm_server.cc:2023:113: error: expected ';' before 'row'
src/dbm/dbm_shm_server.cc:2023:113: error: 'row' was not declared in this scope
src/dbm/dbm_shm_server.cc:2024:37: error: expected ')' before ';' token
                 row != my_map->end();
                                     ^
src/dbm/dbm_shm_server.cc:2023:98: warning: unused variable 'const_iterator' [-Wunused-variable]
                 for (boost::container::flat_map<int, tlsStorage, std::less<int>() ,alloc_inst >::const_iterator row = my_map->begin();
                                                                                                  ^
src/dbm/dbm_shm_server.cc:2025:19: error: 'row' was not declared in this scope
                 ++row)
                   ^
src/dbm/dbm_shm_server.cc:2025:22: error: expected ';' before ')' token
                 ++row)
                      ^
distcc[31606] ERROR: compile src/dbm/dbm_shm_server.cc on localhost failed
scons: *** [debug/build/x86_64-unknown-freebsd9.2/dbm/dbm_shm_server.o] Error 1
scons: building terminated because of errors.

person user3208010    schedule 31.01.2014    source источник
comment
Пожалуйста, используйте автономный пример кода: sscce.org. Поэтому вопросы не должны быть головоломками кода, если вы ожидаете, что они будут ответил   -  person sehe    schedule 01.02.2014


Ответы (1)


Ваш код кажется полностью запутанным. И ошибки лишь немного связаны с показанным кодом...[1]

Неважно, я понял, что в вашем реальном коде (ShmServer::fake_notify) вы объявляете объявление allocInst, почти как вы показали, но const:

const tlsShmemAllocator alloc_inst (mySeg.get_segment_manager());

Что также прекрасно объясняет, почему ваша переменная управления циклом имеет недопустимый тип:

error: the value of 'alloc_inst' is not usable in a constant expression
error:   expected a type, got 'alloc_inst'

Я имею в виду, на самом деле, компилятор не может быть более явным. В случае, если это было недостаточно ясно, было добавлено красивое ascii-искусство:

for(flat_map<int, tlsStorage, std::less<int>() ,alloc_inst >::const_iterator row = my_map->begin();

Так что да... вы пытаетесь передать распределитель как аргумент type распределителя? Вместо этого используйте типы в качестве аргументов шаблона. Обратите внимание на использование typedefs для уменьшения беспорядка в коде:

typedef boost::container::flat_map<
    int, tlsStorage, std::less<int>, tlsShmemAllocator> ShmTable;
typedef ShmTable::const_iterator ShmTableIt;

for(ShmTableIt rowit=my_map->begin(); rowit!=my_map->end(); ++rowit)
{
     ShmTableIt::value_type const& row = *rowit;

     int id                  = row.first;
     tlsStorage const& rowData = row.second;
}

Теперь, конечно, с C++ 11 вы могли бы написать это без всех этих определений типов.

for(auto rowit=my_map->begin(); rowit!=my_map->end(); ++rowit)
{
     int id       = rowit->first;
     auto& rowData = rowit->second;
}

Или даже ближе к делу:

for(auto const& row : *my_map)
{
     int id       = row.first;
     auto& rowData = row.second;
}

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


[1] некоторые моменты на всякий случай:

  • boost::container::flat_map — это шаблон, поэтому ваше объявление не может быть правильным. Я подозреваю, что у вас действительно есть

    tlsSHMMap* tls_temp_map;
    

    Зачем вы дали нам ложный код? Это не связано?

  • На самом деле, это my_map в вашем реальном коде? или tls_temp_map? Или tls_main_map (которое вы не показываете, но объявлено и никогда не используется...)?

person sehe    schedule 31.01.2014