Увеличьте shared_ptr с помощью 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;

Спасибо.

1

Решение

На самом деле, это похоже на API в стиле C, где они полностью скрыли реализацию modbus_t от вас как пользователя (поскольку вы передаете указатель на свободные функции, а не вызываете членов объекта).

Это означает, что вы не можете использовать shared_ptr из коробки (так как для вызова требуется определение delete, что также является неправильным вызовом). Там может быть способом использования пользовательского средства удаления, вызывающего соответствующую функцию очистки (возможно, modbus_free). Затем вы должны будете использовать .get() чтобы получить необработанный указатель в любое время, когда вы захотите вызвать API.

1

Другие решения

Вы могли бы — возможно — использовать

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.

Это, конечно, при условии, что существует уникальная собственность.

3

По вопросам рекламы [email protected]