Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost.signals2如何将动态分配的对象连接到信号_C++_Boost_Boost Signals2 - Fatal编程技术网

C++ 使用boost.signals2如何将动态分配的对象连接到信号

C++ 使用boost.signals2如何将动态分配的对象连接到信号,c++,boost,boost-signals2,C++,Boost,Boost Signals2,我有一个名为Candidate的类,其中包含一个名为DataUpdate()的函数。我打算动态创建多个候选实例,并让每个实例将其函数DataUpdate()作为插槽连接到boost.signals2信号;准备接收信号 我在下面开发的代码给出了错误: 错误2错误C2276:“&”:对绑定成员函数表达式的操作非法 我不确定实现预期结果的正确代码。问题似乎在于取消引用指针candidateInstance,以获取要传递给signal.connect()的实例的DataUpdate()函数的地址。有人能

我有一个名为
Candidate
的类,其中包含一个名为
DataUpdate()
的函数。我打算动态创建多个候选实例,并让每个实例将其函数
DataUpdate()
作为插槽连接到
boost.signals2
信号;准备接收信号

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

错误2错误C2276:“&”:对绑定成员函数表达式的操作非法

我不确定实现预期结果的正确代码。问题似乎在于取消引用指针
candidateInstance
,以获取要传递给
signal.connect()
的实例的
DataUpdate()
函数的地址。有人能告诉我正确的方法吗

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());

您应该使用
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;
}
#包括
#包括
#包括
#包括
福班
{
公众:
void foo()
{

std::cout所以我尝试使用您建议的格式,但这一行是signal.connect(std::bind(std::mem_fn(&Candidate::DataUpdate),candidateInstance.get());给出错误;错误C2064:术语不适用于包含6个参数的函数。如何修复它?谢谢。@看起来您的函数的参数比我的答案中表示的函数多。在这种情况下,您应该使用。
bind
不需要
mem\u fn
,并且可以绑定到
shared\u ptr
@很快,谢谢你让我走上正轨,让代码像这样编译和运行:
//实例化候选实例++数据流::ID;//增加静态变量以给出唯一的ID号。候选*候选实例实例=新候选(ID,iDataNumber);//连接候选实例信号的DATAUPDATE().CONNECT(绑定(&CANDIDATE::DATAUPDATE,candidateInstance,_1,_2,_3,_4,_5,_6,_7));//火灾信号(iDataNumber,BarNumber(),DateTime(),Open(),High(),Low(),Close());
@GoFaster,很高兴它有帮助:)