首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost-Python原始指针构造函数

Boost-Python原始指针构造函数
EN

Stack Overflow用户
提问于 2010-06-23 17:12:24
回答 1查看 747关注 0票数 0

我正在尝试使用boost- C++将一个python库公开给python。该库实际上包装了一个底层的C api,因此大量使用原始指针。

代码语言:javascript
复制
// implementation of function that creates a Request object
inline Request Service::createRequest(const char* operation) const
{
    blpapi_Request_t *request;
    ExceptionUtil::throwOnError(
            blpapi_Service_createRequest(d_handle, &request, operation)
        );
    return Request(request);
}

// request.h
class Request {
    blpapi_Request_t *d_handle;
    Element           d_elements;
    Request& operator=(const Request& rhs); // not implemented
public:
    explicit Request(blpapi_Request_t *handle); 
    Request(RequestRef ref);
    Request(Request &src);
};

// request.cpp
BOOST_PYTHON_MODULE(request)
{
    class_<blpapi_Request_t>;
    class_<Request, boost::noncopyable>("Request", init<blpapi_Request_t *>())
    .def(init<Request&>())
    ;
}

尽管request.cpp编译成功,但当我尝试使用该对象时,我得到了以下错误:

代码语言:javascript
复制
// error output
TypeError: No to_python (by-value) converter found for C++ type: class Request

为了调用它,python代码如下所示:

代码语言:javascript
复制
from session import *
from service import *
from request import *

so = SessionOptions()
so.setServerHost('localhost')
so.setServerPort(8194)

session = Session(so)

# start sesssion
if not session.start():
    print 'Failed to start session'
    raise Exception

if not session.openService('//blp/refdata'):
    print 'Failed to open service //blp/refdata'
    raise Exception

service = session.getService('//blp/refdata')
request = service.createRequest('ReferenceDataRequest')

其他对象(SessionOptions、Session、Service)等也是c++对象,我已经成功地为其创建了boost-python包装器。

据我从boost-python文档中了解,这与传递原始指针有关,但我真的不知道我还应该做什么……

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-24 06:40:25

您的class_<blpapi_Request_t>;没有声明任何内容;该代码的版本正确吗?

如果是,那么更新它:

代码语言:javascript
复制
class_<blpapi_Request_t>("blpapi_Request_t");

也就是说,该错误表明您正在尝试使用自动转换为尚未定义的python对象的请求对象。

出现此错误的原因是因为您将请求包装为boost::noncopyable,然后提供了一个工厂方法,该方法通过值返回请求对象;boost::noncopyable意味着不会生成复制构造函数,因此不存在自动到python的转换器。

解决方法有两种:一种是删除不可复制提示;另一种是注册一个转换器,它接受一个C++请求并返回一个Python Request对象。你真的需要请求的不可复制语义吗?

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

https://stackoverflow.com/questions/3100341

复制
相关文章

相似问题

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