I'm using Boost 1.49, and Visual Studio 10.

I'm having a hard time figuring out how to store a shared_ptr to a derived class in a collection of shared_ptr to the base class. This is something I do all the time with normal shared pointers. This is my code:

{
   struct Base {};
   struct Derived : public Base {};

   typedef
      boost::interprocess::managed_shared_ptr
      <
         Base,
         boost::interprocess::managed_shared_memory
      >::type Base_ptr;

   typedef
      boost::interprocess::deque
      <
         Base_ptr,
         boost::interprocess::managed_shared_memory::allocator< Base_ptr >::type
      > Queue;

   struct shm_remove
   {
      shm_remove() { boost::interprocess::shared_memory_object::remove("testing"); }
      ~shm_remove() { boost::interprocess::shared_memory_object::remove("testing"); }
   } remover;

   boost::interprocess::managed_shared_memory shared_memory(
      boost::interprocess::create_only,
      "testing",
      65536);

   Queue* queue =
      shared_memory.construct< Queue >(boost::interprocess::anonymous_instance)(
         shared_memory.get_allocator< Base_ptr >());

   queue->push_back(
      bi::make_managed_shared_ptr< Derived >(
         shared_memory.construct< Derived >(bi::anonymous_instance)(),
         shared_memory));
}

The compiler tells me a bunch of cryptic stuff, I think it has to do with the different deleter types:

boost/container/deque.hpp(1040): error C2664: 'boost::interprocess::shared_ptr<T,VoidAllocator,Deleter>::shared_ptr(const boost::interprocess::offset_ptr<PointedType,DifferenceType,OffsetType,OffsetAlignment> &,const VoidAllocator &,const Deleter &)' : cannot convert parameter 1 from 'const boost::interprocess::shared_ptr<T,VoidAllocator,Deleter>' to 'const boost::interprocess::offset_ptr<PointedType,DifferenceType,OffsetType,OffsetAlignment> &'
5>          with
5>          [
5>              T=Base,
5>              VoidAllocator=boost::interprocess::allocator<void,boost::interprocess::segment_manager<char,boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>,boost::interprocess::iset_index>>,
5>              Deleter=boost::interprocess::deleter<Base,boost::interprocess::segment_manager<char,boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>,boost::interprocess::iset_index>>,
5>              PointedType=Base,
5>              DifferenceType=ptrdiff_t,
5>              OffsetType=size_t,
5>              OffsetAlignment=0
5>          ]
5>          and
5>          [
5>              T=Derived,
5>              VoidAllocator=boost::interprocess::allocator<void,boost::interprocess::segment_manager<char,boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>,boost::interprocess::iset_index>>,
5>              Deleter=boost::interprocess::deleter<Derived,boost::interprocess::segment_manager<char,boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>,boost::interprocess::iset_index>>
5>          ]
5>          and
5>          [
5>              PointedType=Base,
5>              DifferenceType=ptrdiff_t,
5>              OffsetType=size_t,
5>              OffsetAlignment=0
5>          ]
5>          Reason: cannot convert from 'const boost::interprocess::shared_ptr<T,VoidAllocator,Deleter>' to 'const boost::interprocess::offset_ptr<PointedType,DifferenceType,OffsetType,OffsetAlignment>'
5>          with
5>          [
5>              T=Derived,
5>              VoidAllocator=boost::interprocess::allocator<void,boost::interprocess::segment_manager<char,boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>,boost::interprocess::iset_index>>,
5>              Deleter=boost::interprocess::deleter<Derived,boost::interprocess::segment_manager<char,boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>,boost::interprocess::iset_index>>
5>          ]
5>          and
5>          [
5>              PointedType=Base,
5>              DifferenceType=ptrdiff_t,
5>              OffsetType=size_t,
5>              OffsetAlignment=0
5>          ]
5>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
5>          test.cpp(94) : see reference to function template instantiation 'void boost::container::deque<T,A>::push_back<boost::interprocess::shared_ptr<Derived,VoidAllocator,Deleter>>(const BOOST_MOVE_TEMPL_PARAM &)' being compiled
5>          with
5>          [
5>              T=Base_ptr,
5>              A=boost::interprocess::allocator<Base_ptr,boost::interprocess::segment_manager<char,boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>,boost::interprocess::iset_index>>,
5>              VoidAllocator=boost::interprocess::allocator<void,boost::interprocess::segment_manager<char,boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>,boost::interprocess::iset_index>>,
5>              Deleter=boost::interprocess::deleter<Derived,boost::interprocess::segment_manager<char,boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>,boost::interprocess::iset_index>>,
5>              BOOST_MOVE_TEMPL_PARAM=boost::interprocess::shared_ptr<Derived,boost::interprocess::allocator<void,boost::interprocess::segment_manager<char,boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>,boost::interprocess::iset_index>>,boost::interprocess::deleter<Derived,boost::interprocess::segment_manager<char,boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>,boost::interprocess::iset_index>>>
5>          ]
---
Aaron Wright