2015-09-09 79 views
1

我有编译问题与libmodbus。我有以下代码升压shared_ptr的使用typedef结构

boost::shared_ptr <modbus_t> ctx; 
ctx->modbus_new_tcp(ip_address.c_str(), modbus_port); 

,但我得到以下错误

error: invalid use of incomplete type 'struct _modbus' 

它指向此行modbus.h

typedef struct _modbus modbus_t; 

我没有足够的了解这个解决我的问题。你觉得它是什么?这个库不能与智能指针兼容吗?他们告诉你使用正规指针

modbus_t* ctx; 

谢谢。

回答

1

事实上,这似乎是一个C风格的API,他们已经完全隐藏了您作为用户的modbus_t的实现(因为您将指针传递给自由函数而不是调用对象成员)。

这是什么意思,你不能使用shared_ptr开箱(因为它需要定义调用delete,这也恰好是错误的调用)。有可能是一种使用调用相应的清理功能(可能是modbus_free)的自定义删除程序的方式。您随后必须使用.get()才能在您想要调用API时获取原始指针。

+0

谢谢。我在他们的页面上提出了一个问题 – xinthose

+0

您肯定*可以*使用自定义删除程序来调用您想要的任何功能。 – Puppy

3

你可能 - 也许 - 使用

if (std::unique_ptr<modbus_t, void(*)(modbus_t*)> mb(modbus_new_tcp(ip_address.c_str(), modbus_port), &modbus_free)) { 

    modbus_connect(mb); 

    /* Read 5 registers from the address 0 */ 
    modbus_read_registers(mb, 0, 5, tab_reg); 

    modbus_close(mb); 
} // modbus_free invoked, even in the case of exception. 

这当然,假设有独特的所有权。

+4

谢谢。我希望c程序员会拥抱Boost更多 – xinthose

+0

@xinthose谢谢。我同意,但我想指出,在这个答案中没有任何提升特定的:) – sehe