TypeError:找不到C++类型的to_python(按值)转换器
TypeError: No to_python (by-value) converter found for C++ type
我正试图使用Boost.Python将我的C++类公开给Python
struct Base {
virtual ~Base() {};
virtual char const *Hello() {
printf("Base.Hellon");
return "Hello. I'm Base.";
};
};
struct Derived : Base {
char const *Hello() {
printf("Derived.Hellon");
return "Hello. I'm Derived.";
};
Base &test() {
printf("Derived.testn");
// ...
// After some calculation, we get result reference `instance'
// `instance' can be an instance of Base or Derived.
// ...
return instance;
}
};
我想在python中使用以上类,如下所示:
instance = Derived()
// If method test returns an instance of Base
instance.test().Hello() // Result: "Hello. I'm Base."
// If method test returns an instance of Derived
instance.test().Hello() // Result: "Hello. I'm Derived."
我不知道这个问题有什么好的解决办法。我刚试过这个:
struct BaseWrapper : Base, wrapper<Base> {
char const *Hello() {
printf("BaseWrapper.Hellon");
if (override Hello = this->get_override("Hello")) {
return Hello();
}
return Base::Hello();
}
char const *default_Hello() {
printf("BaseWrapper.default_Hellon");
return this->Base::Hello();
}
};
struct DerivedWrapper : Derived, wrapper<Derived> {
char const *Hello() {
printf("DerivedWrapper.Hellon");
if (override Hello = this->get_override("Hello")) {
return Hello();
}
return Derived::Hello();
}
char const *default_Hello() {
printf("DerivedWrapper.default_Hellon");
return this->Derived::Hello();
}
Base &test() {
printf("DerivedWrapper.testn");
if (override Hello = this->get_override("test")) {
return Hello();
}
return Derived::test();
}
Base &default_test() {
printf("DerivedWrapper.default_testn");
return this->Derived::test();
}
};
和他们,我使用以下代码:
BOOST_PYTHON_MODULE(Wrapper) {
class_<BaseWrapper, boost::noncopyable>("Base")
.def("Hello", &Base::Hello, &BaseWrapper::default_Hello);
class_<DerivedWrapper, boost::noncopyable, bases<Base> >("Derived")
.def("Hello", &Derived::Hello, &DerivedWrapper::default_Hello)
.def("test", &Derived::test, return_value_policy<copy_non_const_reference>());
}
但当我把上面的代码编译成.so文件,并在python 中使用时
derived = Wrapper.Derived()
derived.test()
它抛出了一个例外:
TypeError: No to_python (by-value) converter found for C++ type: Base
这篇文章和我的错误一样,但从另一方面来说,它对我没有太大帮助。Boost.Python调用(通过引用):TypeError:找不到C++类型的to_Python(通过值)转换器:
这篇文章解决了类似的问题,但对我也没有帮助。https://github.com/BVLC/caffe/issues/3494
我有两个问题:
- 如果我尝试的方法是正确的,如何解决TypeError问题
- 如果我尝试了错误的方法,那么使用boost.python解决问题的最佳方法是什么
此代码适用于我:
struct Base {
virtual ~Base() {};
virtual char const *hello() {
return "Hello. I'm Base.";
};
};
struct Derived : Base {
char const *hello() {
return "Hello. I'm Derived.";
};
Base &test(bool derived) {
static Base b;
static Derived d;
if (derived) {
return d;
} else {
return b;
}
}
};
BOOST_PYTHON_MODULE(wrapper)
{
using namespace boost::python;
class_<Base>("Base")
.def("hello", &Base::hello)
;
class_<Derived, bases<Base>>("Derived")
.def("test", &Derived::test, return_internal_reference<>())
;
}
测试模块:
>>> import wrapper
>>> d = wrapper.Derived()
>>> d.test(True).hello()
"Hello. I'm Derived."
>>> d.test(False).hello()
"Hello. I'm Base."
>>>
相关文章:
- 按值捕获引用时出现非常量
- 按值 C++ 返回时进行双倍移动
- 为什么默认复制函数在按值发送参数时不调用?
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 如何使地图按值C++排序
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- C++类 - 初始化列表 - 递归 - 按值传递
- 将函数参数完美转发到函数指针:按值传递呢?
- 棘手的按值传递和按引用递归问题传递
- c++ lambda:柯里和函数:使用按值捕获与按引用捕获返回不同的结果
- 不同于按值传递和常量引用传递的程序集
- C++ 获取函数在常量引用中按值返回的结果
- 在按值调用 (c++) 中转发构造函数参数
- C++ - 是否可以让子类按值包含包含类?
- 尝试按值对地图进行排序,但出现错误
- 按值传递变量与按引用传递变量具有相同的结果
- 将包含二进制数据的 QByteArray 传递到按值运行
- C++ STL 设置按值擦除
- 当 RVO 可以应用时,为什么要按shared_ptr而不是按值返回?