2010-06-23 103 views
0

我想使用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文档这个有事情做与周围将原料指针理解,但我真的不知道我应该做些什么?

回答

1

class_<blpapi_Request_t>;没有声明什么;那个代码是正确的版本?

如果是这样,那么更新:

class_<blpapi_Request_t>("blpapi_Request_t"); 

这就是说,这是什么错误指示是,你要使用Request对象与自动转换为尚未定义的Python对象。

你得到这个错误的原因是你已经将请求包装为boost :: noncopyable,然后提供了一个工厂方法,它通过值返回一个Request对象; boost :: noncopyable意味着没有拷贝构造函数被生成,因此没有自动的to-python转换器。

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

+0

我已编辑原始帖子以显示调用createRequest的Python代码 – m0nonoke 2010-06-24 07:42:38

+0

我编辑了我的答案。 python方面的用法给了我需要的提示,谢谢! – 2010-06-24 12:40:44