2015-09-09 4 views
1

У меня проблемы с компиляцией с libmodbus. У меня есть следующий кодBoost shared_ptr с typedef struct

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-интерфейс С, где они полностью скрывают реализацию 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

Спасибо. Я хочу, чтобы программисты могли бы использовать Boost больше – xinthose

+0

@xinthose Спасибо. Я согласен, но я хотел бы отметить, что в этом ответе нет ничего особенного: – sehe

Смежные вопросы