Boost-Python原始指针构造函数
问题描述:
我想使用boost-python向python公开一个C++库。该库实际上包装了一个底层C api,因此使用了很多原始指针。Boost-Python原始指针构造函数
// 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编译成功,当我尝试使用我收到以下错误的对象:
// error output
TypeError: No to_python (by-value) converter found for C++ type: class Request
中,为了调用这个Python代码的样子:
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)等也是我已经成功创建boost-python包装的C++对象。
当我从升压Python文档这个有事情做与周围将原料指针理解,但我真的不知道我应该做些什么?
答
您class_<blpapi_Request_t>;
没有声明什么;那个代码是正确的版本?
如果是这样,那么更新:
class_<blpapi_Request_t>("blpapi_Request_t");
这就是说,这是什么错误指示是,你要使用Request对象与自动转换为尚未定义的Python对象。
你得到这个错误的原因是你已经将请求包装为boost :: noncopyable,然后提供了一个工厂方法,它通过值返回一个Request对象; boost :: noncopyable意味着没有拷贝构造函数被生成,因此没有自动的to-python转换器。
两种方式:一种是删除不可复制的提示;另一个是注册一个转换器,它接受一个C++请求并返回一个Python请求对象。你真的需要Request的不可复制语义吗?
我已编辑原始帖子以显示调用createRequest的Python代码 – m0nonoke 2010-06-24 07:42:38
我编辑了我的答案。 python方面的用法给了我需要的提示,谢谢! – 2010-06-24 12:40:44