У меня проблемы с компиляцией 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;
Спасибо.
На самом деле, это похоже на API в стиле C, где они полностью скрыли реализацию modbus_t
от вас как пользователя (поскольку вы передаете указатель на свободные функции, а не вызываете членов объекта).
Это означает, что вы не можете использовать shared_ptr
из коробки (так как для вызова требуется определение delete
, что также является неправильным вызовом). Там может быть способом использования пользовательского средства удаления, вызывающего соответствующую функцию очистки (возможно, modbus_free
). Затем вы должны будете использовать .get()
чтобы получить необработанный указатель в любое время, когда вы захотите вызвать API.
Вы могли бы — возможно — использовать
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.
Это, конечно, при условии, что существует уникальная собственность.