Boost logo

Boost Users :

Subject: [Boost-users] boost::unordered_map using boost::interprocess::cached_node_allocator compilation failure
From: Lenny Maiorani (lenny_at_[hidden])
Date: 2011-09-14 17:35:24


Hi Boost-ers,

I am trying to create a boost::unordered_map in a boost::interprocess::managed_shared_memory segment. This works fine until I try to change from using boost::interprocess::allocator to boost::interprocess::cached_node_allocator.

It seems that the hash_bucket structure is deferring the key size calculation, but the cached_node_allocator needs the size at compilation time. Any ideas on how to make this work?

Below is a sample attempt which displays my problem along with the GCC output.

Thanks,
-Lenny

Sample code:
#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 output:
$ 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> >’
$


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net