我使用std::bind创建了一个包含类成员函数的lambda,但是boost::signals2不接受它。
我有一个Cut类,当有新的Event需要查看时,我想通过调用void Cut::newEvent(Event& e)来通知它。
我创建了一个到Cut实例的lambda绑定,当我向它传递一个事件时,它就像预期的那样工作。(代码编译后,输出为"Registered new event“。)
但是,当我尝试将这个lambda连接到boost::signals2::signal<void(Event&)>的一个实例时,它会报错并显示以下消息:
error: 'f' cannot be used as a function
这很奇怪,因为我可以将它用作main()中的函数。(如果我使用std::function<void(Event&)>而不是auto,我会得到同样的结果。
有没有可能做到这一点?为什么它现在不能工作?
相关代码如下:
#include <iostream>
#include <boost/signals2.hpp>
//Dummy event class
struct Event
{ int val; };
typedef boost::signals2::signal<void (Event&) >
EventBroadcaster;
//Class I want to notified of new events
class Cut
{
public:
void newEvent( Event& e)
{
std::cout << "Registered new event" << std::endl;
fResult = true;
}
bool check() const
{ return fResult; }
private:
bool fResult;
};
int main()
{
Cut c{};
//Lambda to call newEvent on c
auto f =
std::bind( &Cut::newEvent, &c,
std::placeholders::_1) ;
Event e{};
f(e); //works
EventBroadcaster eb;
eb.connect(&f); //doesn't work
}发布于 2013-07-23 20:20:52
你应该使用
eb.connect(f);因为f是可调用的函数对象,但&f是不可调用的。
https://stackoverflow.com/questions/17809957
复制相似问题