[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