Я изо всех сил пытаюсь правильно использовать boost :: function и boost :: bind, чтобы связать переданный объект и функцию-член в boost :: function, которая вызывается позже, когда данные находятся в очереди
IЯ работаю над многопользовательской единой потребительской очередью для связи между потоками.Основная идея заключается в предоставлении шаблона класса.Когда данные публикуются в очереди, подписчик получает данные с помощью функции обратного вызова, которая должна быть предоставлена при подписке.
Примечание: ...
обозначает места, где я опускаю код для удобства чтения
T - это тип, который хранится в очереди
template <typename T>
class pipeline_mpsc
{...};
Функция подписки
template <typename FUNC, class OBJ>
bool subscribe(FUNC fn, OBJ obj)
{
bool loc_return = false;
if (Callback_fn_ == NULL)
{
boost::function<void(const T &)> BoundCallback(boost::bind(fn, obj, _1));
Callback_fn_ = &BoundCallback;
boost::thread th(&pipeline_mpsc::Callbackcaller, this, &BoundCallback); //pipeline.hpp[38, 25]
loc_return = true;
}
return loc_return;
};
void Callbackcaller(boost::function<void(const T &)> *Callback_fn) {
...
Callback_fn(loc_tmp); //pipeline.hpp[96, 18]
};
Как я вызываю функцию подписки
laserscan_sub_->subscribe(&LidarFovFilter::laserscan_callback, this); //LidarFovFilter.cpp[25, 73]
Прототип функции обратного вызова
void LidarFovFilter::laserscan_callback(const LaserScan &scan)
Когда яскомпилируйте его, я получаю следующую ошибку от gcc:
'Callback_fn' не может быть использован как функция
pipe.hpp [96, 18]: в экземпляре void pipeline_mpsc :: Callbackcaller (boost:: function ) [with T = LaserScan] ': pipeline.hpp [38, 25]: требуется из' bool pipeline_mpsc :: subscribe (FUNC, OBJ) [с FUNC = void (LidarFovFilter :: *)1030 *) (const LaserScan &);OBJ = LidarFovFilter *;T = LaserScan] '
LidarFovFilter.cpp [25, 73]: требуется здесь
Из того, что я прочитал, как использовать boost :: bind и boost :: function, я думаю, что это мой коддолжен работать (но, очевидно, это не так). Я в недоумении, почему это не так.Где моя ошибка?Помощь будет действительно ценной.