2013-05-13 19 views
0

我有一个名为Candidate的类,其中包含一个名为DataUpdate()的函数。我打算动态地创建Candidate的许多实例,并让每个实例将其功能DataUpdate()作为插槽连接到boost.signals2信号;准备好接收信号。使用boost.signals2如何将动态分配的对象连接到信号

我在下面开发是给错误的代码:

Error 2 error C2276: '&' : illegal operation on bound member function expression

我不能确定正确的代码,以达到预期的效果。问题似乎在于解引用指针candidateInstance以获取实例的DataUpdate()函数的地址传递给signal.connect()。有没有人能够建议正确的方法?

Candidate *candidateInstance; 

//INSTANTIATE CANDIDATE INSTANCE 
++DataStream::ID;//increment static variable 
candidatesVector.push_back(candidateInstance = new Candidate(ID)); 

//CONNECT DATAUPDATE() OF CANDIDATE INSTANCE 
signal.connect(&((*candidateInstance).DataUpdate)); 

//FIRE SIGNAL 
signal(BarNumber(), DateTime(), Open(), High(), Low(), Close()); 

回答

2

您应该使用bind来创建成员函数的包装。

#include <iostream> 
#include <memory> 
#include <functional> 

#include <boost/signals2.hpp> 

class Foo 
{ 
public: 
    void foo() 
    { 
     std::cout << "I'm foo() from Foo, this == " << this << std::endl; 
    } 
}; 

int main() 
{ 
    auto foo_ptr = std::make_shared<Foo>(); 

    boost::signals2::signal<void()> sig; 

    sig.connect(std::bind(&Foo::foo, foo_ptr)); 

    sig(); 

    return 0; 
} 
+0

所以我尝试使用你建议的格式,但这一行; signal.connect(std :: bind(std :: mem_fn(&Candidate :: DataUpdate),candidateInstance.get()));给出错误;错误C2064:术语不计算带有6个参数的函数。有关如何解决它的任何想法?谢谢。 @soon – GoFaster 2013-05-13 16:38:50

+0

看起来你的函数比我的答案中表示的函数更多的参数。在这种情况下,您应该使用[占位符](http://en.cppreference.com/w/cpp/utility/functional/placeholders)。 – soon 2013-05-13 16:44:46

+0

'bind'不需要'mem_fn'并​​且可以绑定到'shared_ptr':'bind(&Foo :: foo,foo_ptr);' – 2013-05-13 17:48:20