2014-02-15 2 views
3

Этот код был разработан и первоначально работал с boost 1.48. Начиная с обновления для повышения 1.52 он отказывается компилировать.Перегруженная функция пересылки

boost::signals2::signal<void (uint32_t)> foo; 
boost::shared_ptr<boost::circular_buffer<uint32_t>> _foo_buffer = new boost::circular_buffer<uint32_t>(32); 
_foo.connect(boost::bind(&boost::circular_buffer<uint32_t>::push_front, _foo_buffer, _1)); 

Цель состоит в том, чтобы иметь место foo(42)42 на передней части кольцевого буфера.

Ошибка компиляции: No matching function for call to 'bind' с букетом Candidate template ignored: couldn't infer template argument 'R' и схожие ошибки шаблона.

Я подозреваю, что проблема заключается в том, что между версиями наддува, которые я использую, определение для push_front изменилось с

void push_front(const_reference item = value_type()); 

до трех определений

void push_front(param_value_type); 
void push_front(rvalue_type); 
void push_front(); 

и это путать мой компилятор.

Я бы очень признателен за помощь в синтаксисе выражения connect, которое будет работать с новой библиотекой boost. Благодаря

ответ

1

скажем, у вас есть две функции

void foo(int) {} 
void foo(double*) {} 

, то вы не можете просто написать &foo, так как это было бы неоднозначно.

но вы можете использовать static_cast создать контекст, в котором только один кандидат возможно, таким образом:

static_cast<void(*)(int)>(&foo) 

, который дает вам адрес первого, и повторы второй.


что сказал, это выглядит, как вы можете упростить вещи с помощью лямбда-функции ++ C вместо bind (для C++ 03 компилятором в качестве альтернативы определить свой собственный functot).

+0

Статический метод приведения не работает для меня, однако это может быть синтаксическая ошибка. 'static_cast :: *) (uint32_t)> (& boost :: circle_buffer :: push_front)' просто породил подобные ошибки для оригинала. В настоящее время я не на своем компьютере, поэтому я не могу их процитировать. Однако, C++ lambdas отлично работал для меня, так что это уже не проблема. Благодарю. – JamesL

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