我正在尝试在boost :: interprocess :: managed_shared_memory段中创建boost :: unordered_map。这工作正常,直到我尝试从使用boost :: interprocess :: allocator更改为boost :: interprocess :: cached_node_allocator。
似乎hash_bucket结构推迟了密钥大小计算,但cached_node_allocator在编译时需要大小。关于如何使这项工作的任何想法?
示例代码:
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/segment_manager.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <boost/interprocess/allocators/cached_node_allocator.hpp>
#include <boost/unordered_map.hpp>
using namespace boost::interprocess;
int main ()
{
//Create shared memory.
managed_shared_memory segment(create_only,
"SharedMem", //segment name
65536);
// Define cached node allocator type for char in a shared memory segment.
typedef boost::interprocess::
cached_node_allocator<char,
managed_shared_memory::segment_manager> cached_node_allocator_t;
// Define an interprocess string type which uses the cached node allocator.
typedef boost::interprocess::
basic_string<char, std::char_traits<char>,
cached_node_allocator_t> shared_string_t;
// Get an instance of the allocator.
cached_node_allocator_t allocator_instance(
segment.get_segment_manager());
// Create an unordered map with Key and Value as interprocess strings,
// using the default hash and predicate and use the cached node allocator.
boost::unordered_map<shared_string_t, shared_string_t,
boost::hash<shared_string_t>,
std::equal_to<shared_string_t>,
cached_node_allocator_t> my_map_t(allocator_instance);
return 0;
}
GCC输出:
$ g++ -I/opt/local/include cnasum.cc
/opt/local/include/boost/interprocess/allocators/detail/allocator_common.hpp: In instantiation of ‘const size_t boost::interprocess::sizeof_value<boost::unordered_detail::hash_bucket<boost::interprocess::cached_node_allocator<std::pair<const boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >::value’:
/opt/local/include/boost/interprocess/allocators/cached_node_allocator.hpp:104: instantiated from ‘boost::interprocess::cached_node_allocator<boost::unordered_detail::hash_bucket<boost::interprocess::cached_node_allocator<std::pair<const boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul>’
/opt/local/include/boost/unordered/detail/fwd.hpp:134: instantiated from ‘boost::unordered_detail::hash_bucket<boost::interprocess::cached_node_allocator<std::pair<const boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >’
/opt/local/include/boost/unordered/detail/fwd.hpp:278: instantiated from ‘boost::unordered_detail::hash_iterator_base<boost::interprocess::cached_node_allocator<std::pair<const boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul>, boost::unordered_detail::ungrouped>’
/opt/local/include/boost/unordered/detail/fwd.hpp:347: instantiated from ‘boost::unordered_detail::hash_buckets<boost::interprocess::cached_node_allocator<std::pair<const boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul>, boost::unordered_detail::ungrouped>’
/opt/local/include/boost/unordered/detail/fwd.hpp:921: instantiated from ‘boost::unordered_detail::types<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, std::pair<const boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >, boost::hash<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >, std::equal_to<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >, boost::interprocess::cached_node_allocator<std::pair<const boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul>, boost::unordered_detail::map_extractor<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, std::pair<const boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > > >, boost::unordered_detail::ungrouped>’
/opt/local/include/boost/unordered/detail/unique.hpp:125: instantiated from ‘boost::unordered_detail::map<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, boost::hash<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >, std::equal_to<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >, boost::interprocess::cached_node_allocator<std::pair<const boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >’
/opt/local/include/boost/unordered/unordered_map.hpp:63: instantiated from ‘boost::unordered_map<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, boost::hash<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >, std::equal_to<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >’
cnasum.cc:35: instantiated from here
/opt/local/include/boost/interprocess/allocators/detail/allocator_common.hpp:43: error: invalid application of ‘sizeof’ to incomplete type ‘boost::unordered_detail::hash_bucket<boost::interprocess::cached_node_allocator<std::pair<const boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >, boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::cached_node_allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, 64ul> >’
$
答案 0 :(得分:0)
unordered_map
的构造函数必须带有几个参数:
typedef boost::unordered_map< ... > map_type;
map_type m( 100, // number of buckets
boost::hash<shared_string_t>(), // hasher object, pass temporary by value
std::equal_to<shared_string_t>(), // predicate object, ditto
allocator_instance // your allocator object
);