0

ブースト 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.
4

1 に答える 1

2

あなたのコードは完全に混乱しているようです。エラーは、表示されているコードにわずかに関連しています... [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'

つまり、実際には、コンパイラはそれについてこれ以上明確にすることはできませんでした. これが十分に明確でない場合に備えて、かなりのアスキー アートを追加しました。

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

そうですね... アロケーターをアロケーター型の引数として渡そうとしていますか? 代わりに、型をテンプレート引数として使用してください。コードの乱雑さを軽減するための typedef の使用に注意してください。

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 を使えば、これらすべての typedef なしでそれを書くことができます。

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(表示されませんが、宣言され、使用されることはありません...)?

于 2014-01-31T23:10:18.173 に答える