此代码已开发并最初与boost 1.48一起使用。由于更新为boost 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();
它使我的编译器感到困惑。
我非常感谢一些可以使用新升级库的连接表达式的语法帮助。感谢
答案 0 :(得分:1)
假设你有两个功能
void foo( int ) {}
void foo( double* ) {}
然后你不能只写&foo
,因为那样会不明确。
但您可以使用static_cast
来建立只有一个候选人可能的背景,因此:
static_cast<void(*)(int)>( &foo )
,它为您提供第一个的地址,并为第二个提供同样的地址。
说,看起来你可以通过使用C ++ lambda函数而不是bind
来简化事情(对于C ++ 03编译器或者定义你自己的函数)。