首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过引用调用Boost.Python : TypeError:找不到C++类型的to_python (按值)转换器:

通过引用调用Boost.Python : TypeError:找不到C++类型的to_python (按值)转换器:
EN

Stack Overflow用户
提问于 2011-03-17 17:07:56
回答 1查看 13K关注 0票数 21

我正在尝试使用Boost.Python将我的C++类公开给Python。以下是我正在尝试做的事情的简化版本:

我有一个从boost::noncopyable派生的A类,还有一个B类,它的方法将对A的引用作为参数。

代码语言:javascript
复制
class A : boost::noncopyable { /*...*/ };

class B {

public:

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

我按如下方式公开这些类:

代码语言:javascript
复制
/* 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:

代码语言:javascript
复制
import SomeModule


class BDerived(SomeModule.B):

    def do_something(self, a):
        pass

并像这样调用扩展的B:

代码语言:javascript
复制
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();
}

但是,这会导致一条错误消息:

代码语言:javascript
复制
TypeError: No to_python (by-value) converter found for C++ type: A

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

有什么建议如何解决这个问题吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-17 18:04:31

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

请参阅boost手册中的Calling Python Functions and Methods

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5336942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档