gpt4 book ai didi

c++ - 通过引用 : TypeError: No to_python (by-value) converter found for C++ type: 调用 Boost.Python

转载 作者:IT老高 更新时间:2023-10-28 20:48:11 38 4
gpt4 key购买 nike

我正在尝试使用 Boost.Python 将我的 C++ 类公开给 Python。这是我正在尝试做的简单版本:

我有一个从 boost::noncopyable 派生的类 A 和第二个类 B,其方法将 A 的引用作为参数。

class A : boost::noncopyable { /*...*/ };

class B {

public:

virtual void do_something(A& a) {
/*...*/
}
};

我将这些类公开如下:

/* Wrapper for B, so B can be extended in python */
struct BWrap : public B, wrapper<B> {

void do_something(A &a) {

if (override do_something = this->get_override("do_something")) {
do_something(a);
return;
}
else {
B::do_something(a);
}
}

void default_do_something(A& a) { this->B::do_something(a); }
};

BOOST_PYTHON_MODULE(SomeModule) {

class_<A, boost::noncopyable>("A");

class_<BWrap, boost::noncopyable>("B")
.def("do_something", &B::do_something, &BWrap::default_do_something)
;
}

我像这样在python中扩展B:

test.py:

import SomeModule


class BDerived(SomeModule.B):

def do_something(self, a):
pass

并像这样调用扩展的 B:

try {
py::object main = py::import("__main__"); \
py::object global(main.attr("__dict__")); \
py::object result = py::exec_file("test.py", global, global); \
py::object pluginClass = global["BDerived"]; \
py::object plugin_base = pluginClass(); \

B& plugin = py::extract<B&>(plugin_base) BOOST_EXTRACT_WORKAROUND;

A a;
B.do_something(a);
}
catch (py::error_already_set) {
PyErr_Print();
}

但是这会导致错误消息:

TypeError: No to_python (by-value) converter found for C++ type: A

如果 A 不是从 boost::noncopyable 派生的,则代码运行没有任何错误,但 do_something(A& a) 中的参数 a > 在函数调用期间被复制,即使它是通过引用传入的。但仅仅删除对 A 的不可复制要求并不是一种选择,因为它的存在是有原因的。

有什么解决问题的建议吗?

谢谢。

最佳答案

B.do_something(a); 改为 B.do_something(boost::ref(a));.

Calling Python Functions and Methods在 boost 手册中。

关于c++ - 通过引用 : TypeError: No to_python (by-value) converter found for C++ type: 调用 Boost.Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5336942/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com