如何使用Boost.Python导出非默认构造类?
此代码:
class EventHandle {
public:
EventHandle() = delete;
EventHandle(boost::shared_ptr<EventManager> const& em): event_manager_(em) {}
EventHandle(EventHandle const&) = delete;
~EventHandle();
shared_ptr<EventManager> event_manager_;
}
class_<EventHandle, noncopyable,
init<boost::shared_ptr<EventManager> const&>>("EventHandle")
给出以下错误:
/opt/local/include/boost/python/pointee.hpp: In instantiation of 'boost::python::detail::pointee_impl<false>::apply<boost::python::init<const boost::shared_ptr<EventManager>&> >':
/opt/local/include/boost/python/pointee.hpp:38:1: instantiated from 'boost::python::pointee<boost::python::init<const boost::shared_ptr<EventManager>&> >'
/opt/local/include/boost/mpl/eval_if.hpp:38:31: instantiated from 'boost::mpl::eval_if<boost::is_convertible<boost::python::init<const boost::shared_ptr<EventManager>&>*, EventHandle*>, boost::mpl::identity<boost::python::init<const boost::shared_ptr<EventManager>&> >, boost::python::pointee<boost::python::init<const boost::shared_ptr<EventManager>&> > >'
/opt/local/include/boost/python/object/class_metadata.hpp:179:13: instantiated from 'boost::python::objects::class_metadata<EventHandle, boost::noncopyable_::noncopyable, boost::python::init<const boost::shared_ptr<EventManager>&>, boost::python::detail::not_specified>'
/opt/local/include/boost/python/class.hpp:174:42: instantiated from 'boost::python::class_<EventHandle, boost::noncopyable_::noncopyable, boost::python::init<const boost::shared_ptr<EventManager>&> >::id_vector'
/opt/local/include/boost/python/class.hpp:627:55: instantiated from 'boost::python::class_<T, X1, X2, X3>::class_(const char*, const char*) [with W = EventHandle, X1 = boost::noncopyable_::noncopyable, X2 = boost::python::init<const boost::shared_ptr<EventManager>&>, X3 = boost::python::detail::not_specified]'
/Users/neil/nn/src/core/python_event.cc:21:66: instantiated from here
/opt/local/include/boost/python/pointee.hpp:28:44: error: no type named 'element_type' in 'class boost::python::init<const boost::shared_ptr<EventManager>&>'
make[3]: *** [CMakeFiles/distributions.dir/core/python_event.cc.o] Error 1
make[2]: *** [CMakeFiles/distributions.dir/all] Error 2
make[1]: *** [CMakeFiles/distributions.dir/rule] Error 2
make: *** [distributions] Error 2
答案 0 :(得分:4)
您需要使用init<...>
公开构造函数。例如,对于采用两个整数的构造函数:
class_<MyClass>("MyClass", init<int, int>())
....
请注意,您需要将init
放在class_
参数内,而不是放在单独的.def()
调用中,否则Boost会假设您有默认构造函数。
请参阅the tutorial section about constructors。
编辑: 对于您的代码,请尝试:
class_<EventHandle, noncopyable>("EventHandle",
init<boost::shared_ptr<EventManager> const&>())
答案 1 :(得分:1)
您是否尝试过使用no_ini
t?文档说这是为了什么时候你不需要构造函数,但也许你可以将它与明确要求的结合起来?
class_<EventHandle, noncopyable,
init<boost::shared_ptr<EventManager> const&> >
("EventHandle", no_init)