使用 typedef 结构提升 shared_ptr
Boost shared_ptr with typedef struct
我在使用 libmodbus 时遇到编译问题。我有以下代码
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;
谢谢。
事实上,这似乎是一种 C 风格 API,其中他们完全隐藏了 modbus_t
的实现,对您作为用户(因为您将指针传递给自由函数而不是调用对象成员)。
这意味着您不能立即使用 shared_ptr
(因为它需要调用 delete
的定义,这也恰好是错误的调用)。 可能 有一种方法可以使用自定义删除器调用适当的清理函数(可能 modbus_free
)。然后,您必须在任何时候想要调用 API.
时使用 .get()
来获取原始指针
你可以——或许——使用
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.
当然,这是假设存在唯一所有权。
我在使用 libmodbus 时遇到编译问题。我有以下代码
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;
谢谢。
事实上,这似乎是一种 C 风格 API,其中他们完全隐藏了 modbus_t
的实现,对您作为用户(因为您将指针传递给自由函数而不是调用对象成员)。
这意味着您不能立即使用 shared_ptr
(因为它需要调用 delete
的定义,这也恰好是错误的调用)。 可能 有一种方法可以使用自定义删除器调用适当的清理函数(可能 modbus_free
)。然后,您必须在任何时候想要调用 API.
.get()
来获取原始指针
你可以——或许——使用
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.
当然,这是假设存在唯一所有权。