[C++-sig] Custom smart pointer with same behaviour as shared_ptr

Francis Moreau francis_moreau at hotmail.com
Tue Apr 3 16:17:12 CEST 2007


Ok I found my compilation problem.

"Francis Moreau" <francis_moreau at hotmail.com> wrote in message 
news:eurnv7$5cg$1 at sea.gmane.org...
> Hi,
>
> I am passing Python objects to C++ through a shared_ptr smart pointer and 
> it's work well. However I need to have the same behaviour as shared_ptr 
> but with my own version of smart pointer. I try to register and expose my 
> custom smart pointer but I have this compilation error:
>
> boost/python/pointee.hpp(28) : error C2039: 'element_type': is not a 
> member of 'CountedObjPtr<T>'
>        with
>        [
>            T=PyCallEngineState
>        ]
>        boost/python/pointee.hpp(38) : see reference to class template 
> instantiation 'boost::python::detail::pointee_impl<false>::apply<T>' being 
> compiled
>        with
>        [
>            T=CountedObjPtr<PyCallEngineState>
>        ]
>        boost/python/register_ptr_to_python.hpp(17) : see reference to 
> class template instantiation 'boost::python::pointee<T>' being compiled
>        with
>        [
>            T=CountedObjPtr<PyCallEngineState>
>        ]
>        PythonModules.cpp(113) : see reference to function template 
> instantiation 'void 
> boost::python::register_ptr_to_python<CountedObjPtr<T>>(void)'being 
> compiled
>        with
>        [
>            T=PyCallEngineState
>        ]
>
>
> Here is the content of the from_python file for my smart pointer:
>
>  template <class T>
>  struct CountedObjPtr_from_python
>  {
>    CountedObjPtr_from_python()
>    {
>      converter::registry::insert(&convertible,
>                                  &construct,
>                                  type_id<CountedObjPtr<T> >());
>    }
>
>    static void* convertible(PyObject* p)
>    {
>      if (p == Py_None) {
>        return p;
>      }
>
>      return converter::get_lvalue_from_python(
>        p, python::converter::registered<T>::converters);
>    }
>
>    static void construct(PyObject* source,
> 
> python::converter::rvalue_from_python_stage1_data* data)
>    {
>      void* const storage =
>        ((python::converter::rvalue_from_python_storage<CountedObjPtr<T>
> >*)data)->storage.bytes;
>      // Deal with the "None" case.
>      if (data->convertible == source) {
>        new (storage) CountedObjPtr<T>();
>      } else {
>        new (storage) CountedObjPtr<T>(static_cast<T*>(data->convertible));
>      }
>
>      data->convertible = storage;
>    }
>  };
>
>
> And here is the code where I register the smart pointer:
>
> namespace boost{ namespace python{
>
>  template <class T>
>  struct pointee< CountedObjPtr<const T> >
>  {
>    typedef T type;
>  };
>
>  template <class T>
>  inline T* get_pointer(CountedObjPtr<const T> const& p)
>  {
>    return const_cast<T*>(p.get());
>  }
>
> }}
>
> template <typename T>
> void register_CountedObjPtr_conversions()
> {
>  boost::python::converter::registry::insert(
>    &CountedObjPtr_from_python<T>::convertible,
>    &CountedObjPtr_from_python<T>::construct,
>    boost::python::type_id<CountedObjPtr<T> >());
> }
>
> BOOST_PYTHON_MODULE(CallEngineExtending)
> {
>  python::class_<PyCallEngineState, PyCallEngineState_Wrapped,
>                 boost::noncopyable>("PyCallEngineState")
>    ;
>
>  //register_ptr_to_python<boost::shared_ptr<PyCallEngineState> >();
>
>  python::register_ptr_to_python<CountedObjPtr<PyCallEngineState> >();
>  register_CountedObjPtr_conversions<PyCallEngineState>();
> }
>
> Is anyone knows what is missing or wrong with this code? Also, I am not 
> sure this code manages the ref counting properly since there is no call to 
> borrowed or something like this?
>
> Any help would be appreciated,
> Francis 






More information about the Cplusplus-sig mailing list