boost :: bind help для обратного вызова с функцией-членом

Здравствуйте, я студент, работающий над моей программой, которая использует обратный вызов функции-члена. Я столкнулся с использованием привязки, которая именно то, что мне нужно. Я просто испытываю затруднения, заставляя это работать.

Ниже приведен соответствующий код и ошибки компиляции

 // 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*))’

Может кто-нибудь помочь мне с этим, пожалуйста? Спасибо

0

Решение

Во-первых, я удивлен, что вы не получили ошибку с 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* которые разные имена. Я не могу сказать, будет ли это проблемой.

0

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

Других решений пока нет …