我在用Boost.Python要为我的C++库创建包装器,而且我遇到了一些麻烦,整天都在搜索,并没有产生任何结果。例如,我有以下代码:
class Base
{
public:
virtual void func() = 0;
};
class Derived : public Base
{
public:
virtual void func()
{
cout << "Derived::func()"<< endl;
}
};
// wrapper for Base
struct BaseWrapper : Base, python::wrapper<Base>
{
virtual void func()
{
this->get_override("func");
}
};
Base* makeDerived()
{
return new Derived;
}
vector<Base*>* makeDerivedVec()
{
vector<Base*> *v = new vector<Base*>;
v->push_back(new Derived);
v->push_back(new Derived);
v->push_back(new Derived);
return v;
}
BOOST_PYTHON_MODULE(mylib)
{
// export Base
class_<BaseWrapper, noncopyable>("Base")
.def("func", pure_virtual(&Base::func));
class_<vector<Base*> >("BasePtrVec")
.def(vector_indexing_suite<vector<Base*> >());
// export Derived
class_<Derived, bases<Base> >("Derived")
.def("func", &Derived::func);
// export makeDerived()
def("makeDerived", &makeDerived, return_value_policy<manage_new_object>());
// export makeDerivedVec()
def("makeDerivedVec", &makeDerivedVec, return_value_policy<manage_new_object>());
}
因此,我编译它,用python导入并尝试以下操作:
b = mylib.Base() b.func()
d = mylib.makeDerived() d.func()
正如预期的那样,第一行抛出一个异常,说明b.func()是纯虚的,第二行输出
Derived::func()
没关系。在
但是密码
^{pr2}$不起作用,Python抛出一个异常:
TypeError: No to_python (by-value) converter found for C++ type: Base*
为什么它正确处理makeDerived()返回的Base*,并拒绝使用std::vector中包含的Base*?我该怎么做?在
可以通过将
Base*
注册为可用于指向BaseWrapper*
的类型来解决此问题:但这似乎意味着
Base
不能有一个纯虚函数。。。在相关问题 更多 >
编程相关推荐