[C++-sig] wrapper and shared_ptr - how to combine?

Leonard Ritter paniq at paniq.org
Sat Nov 15 21:58:45 CET 2008


It seems I still have no idea what is going on, and I'm starting to become a
bit desparate. I'm going to post as much as possible about the issue I'm
having.

this is the smallest reproduce for the problem i'm having.

typedef boost::shared_ptr<Actor> ActorPtr;

class Actor {
public:
    ActorPtr parent;
    std::vector<ActorPtr> children;

    void add(const ActorPtr &actor);
    void remove(const ActorPtr &actor);
    virtual void queue_redraw() = 0;
};

class PyActor :
    public Actor,
    public wrapper<Actor> {
public:
    virtual void queue_redraw() {
        get_override("queue_redraw")();
    }
};

BOOST_PYTHON_MODULE(nucleus) {
    class_<PyActor, ActorPtr, boost::noncopyable>("Actor")
        .def_readwrite("children", &PyActor::children)
        .def_readwrite("parent", &PyActor::parent)
        .def("add", &PyActor::add)
        .def("remove", &PyActor::remove)
        .def("queue_redraw", pure_virtual(&Actor::queue_redraw))
    ;
}

================ yields ===================

/usr/include/boost/python/object/pointer_holder.hpp: In constructor
'boost::python::objects::pointer_holder<Pointer,
Value>::pointer_holder(PyObject*) [with Pointer =
boost::shared_ptr<halebopp::Actor>, Value = halebopp::Actor]':
/usr/include/boost/python/object/make_holder.hpp:83:   instantiated from
'static void boost::python::objects::make_holder<0>::apply<Holder,
ArgList>::execute(PyObject*) [with Holder =
boost::python::objects::pointer_holder<boost::shared_ptr<halebopp::Actor>,
halebopp::Actor>, ArgList = boost::mpl::vector0<mpl_::na>]'
/usr/include/boost/python/detail/make_keyword_range_fn.hpp:64:
instantiated from 'boost::python::api::object
boost::python::detail::make_keyword_range_constructor(const CallPolicies&,
const boost::python::detail::keyword_range&, Holder*, ArgList*, Arity*)
[with ArgList = boost::mpl::vector0<mpl_::na>, Arity =
boost::mpl::size<boost::mpl::vector0<mpl_::na> >, Holder =
boost::python::objects::pointer_holder<boost::shared_ptr<halebopp::Actor>,
halebopp::Actor>, CallPolicies = boost::python::default_call_policies]'
/usr/include/boost/python/init.hpp:330:   instantiated from 'void
boost::python::detail::def_init_aux(ClassT&, const Signature&, NArgs, const
CallPoliciesT&, const char*, const boost::python::detail::keyword_range&)
[with ClassT = boost::python::class_<halebopp::python::PyActor,
boost::shared_ptr<halebopp::Actor>, boost::noncopyable_::noncopyable,
boost::python::detail::not_specified>, CallPoliciesT =
boost::python::default_call_policies, Signature =
boost::mpl::vector0<mpl_::na>, NArgs =
boost::mpl::size<boost::mpl::vector0<mpl_::na> >]'
/usr/include/boost/python/init.hpp:399:   instantiated from 'static void
boost::python::detail::define_class_init_helper<0>::apply(ClassT&, const
CallPoliciesT&, const Signature&, NArgs, const char*, const
boost::python::detail::keyword_range&) [with ClassT =
boost::python::class_<halebopp::python::PyActor,
boost::shared_ptr<halebopp::Actor>, boost::noncopyable_::noncopyable,
boost::python::detail::not_specified>, CallPoliciesT =
boost::python::default_call_policies, Signature =
boost::python::init_base<DerivedT>::visit(classT&) const [with classT =
boost::python::class_<halebopp::python::PyActor,
boost::shared_ptr<halebopp::Actor>, boost::noncopyable_::noncopyable,
boost::python::detail::not_specified>, DerivedT =
boost::python::init<mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_>]::signature, NArgs =
boost::mpl::size<boost::mpl::vector0<mpl_::na> >]'
/usr/include/boost/python/init.hpp:171:   instantiated from 'void
boost::python::init_base<DerivedT>::visit(classT&) const [with classT =
boost::python::class_<halebopp::python::PyActor,
boost::shared_ptr<halebopp::Actor>, boost::noncopyable_::noncopyable,
boost::python::detail::not_specified>, DerivedT =
boost::python::init<mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_>]'
/usr/include/boost/python/def_visitor.hpp:31:   instantiated from 'static
void boost::python::def_visitor_access::visit(const V&, classT&) [with V =
boost::python::def_visitor<boost::python::init<mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_> >, classT =
boost::python::class_<halebopp::python::PyActor,
boost::shared_ptr<halebopp::Actor>, boost::noncopyable_::noncopyable,
boost::python::detail::not_specified>]'
/usr/include/boost/python/def_visitor.hpp:67:   instantiated from 'void
boost::python::def_visitor<DerivedVisitor>::visit(classT&) const [with
classT = boost::python::class_<halebopp::python::PyActor,
boost::shared_ptr<halebopp::Actor>, boost::noncopyable_::noncopyable,
boost::python::detail::not_specified>, DerivedVisitor =
boost::python::init<mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_>]'
scons: building terminated because of errors.
/usr/include/boost/python/class.hpp:225:   instantiated from
'boost::python::class_<T, X1, X2, X3>& boost::python::class_<T, X1, X2,
X3>::def(const boost::python::def_visitor<Derived>&) [with Derived =
boost::python::init<mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_>, W = halebopp::python::PyActor, X1 =
boost::shared_ptr<halebopp::Actor>, X2 = boost::noncopyable_::noncopyable,
X3 = boost::python::detail::not_specified]'
/usr/include/boost/python/class.hpp:501:   instantiated from 'void
boost::python::class_<T, X1, X2, X3>::initialize(const DefVisitor&) [with
DefVisitor = boost::python::init<mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_>, W = halebopp::python::PyActor, X1 =
boost::shared_ptr<halebopp::Actor>, X2 = boost::noncopyable_::noncopyable,
X3 = boost::python::detail::not_specified]'
/usr/include/boost/python/class.hpp:629:   instantiated from
'boost::python::class_<T, X1, X2, X3>::class_(const char*, const char*)
[with W = halebopp::python::PyActor, X1 =
boost::shared_ptr<halebopp::Actor>, X2 = boost::noncopyable_::noncopyable,
X3 = boost::python::detail::not_specified]'
src/nucleus/export_ogl.cpp:94:   instantiated from here
/usr/include/boost/python/object/pointer_holder.hpp:179: error: cannot
allocate an object of abstract type 'halebopp::Actor'
src/nucleus/ogl.hpp:38: note:   because the following virtual functions are
pure within 'halebopp::Actor':
src/nucleus/ogl.hpp:74: note:     virtual void
halebopp::Actor::queue_redraw()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20081115/7be4d14c/attachment.htm>


More information about the Cplusplus-sig mailing list