Здравствуйте, я студент, работающий над моей программой, которая использует обратный вызов функции-члена. Я столкнулся с использованием привязки, которая именно то, что мне нужно. Я просто испытываю затруднения, заставляя это работать.
Ниже приведен соответствующий код и ошибки компиляции
// this is the API function to register callback
void register_callback_datapoint(void(*)(datapoint_t *datapoint) cb_datapoint )
// this function is my callback
void datapoint_update(datapoint_t* datapoint);
// this code is called in the aggregateThread class
boost::function<void(datapoint_t*)> f;
f = bind(&aggregateThread::datapoint_update, this, std::tr1::placeholders::_1);
register_callback_datapoint(f);
// here is the compile error
cannot convert ‘boost::function<void(datapoint_opaque_t*)>’ to ‘void (*)(datapoint_t*)
{aka void (*)(datapoint_opaque_t*)}’ for argument ‘1’ to ‘void
register_callback_datapoint(void (*)(datapoint_t*))’
Может кто-нибудь помочь мне с этим, пожалуйста? Спасибо
Во-первых, я удивлен, что вы не получили ошибку с void register_callback_datapoint(void(*)(datapoint_t *datapoint) cb_datapoint )
, Правильный синтаксис будет void register_callback_datapoint(void(*cb_datapoint)(datapoint_t *datapoint));
для объявления указателя функции в качестве параметра.
Однако проблема в том, что вы пытаетесь передать boost::function
, который является функциональный объект и неявно преобразуется в указатель на функцию register_callback_datapoint
, Вам нужно изменить параметр на boost::function
или сделайте это шаблоном.
void register_callback_datapoint(boost::function<void(datapoint_opaque_t*)> f);
или же
template <typename Func>
void register_callback_datapoint(Func f);
Кроме того, я только что заметил это, но ваш пример и ошибка компиляции не совпадают. Один говорит datapoint_opaque_t*
а другой говорит datapoint_t*
которые разные имена. Я не могу сказать, будет ли это проблемой.
Других решений пока нет …