gpt4 book ai didi

c++ - 提供一个方法作为回调函数 (gcc 4.7.1)

转载 作者:太空宇宙 更新时间:2023-11-04 16:25:51 25 4
gpt4 key购买 nike

我试图将一个看似简单的回调方法指针设置到一个变量中并得到以下错误:

CSerialSniffer.cpp|11|error: cannot convert ‘CSerialSniffer::AsyncRecieverReceived’ from type ‘Nexus::TReceiveCallback (CSerialSniffer::)(Nexus::CData*, Nexus::IMetaData*)’}’| to type ‘Nexus::typeAsyncReceiverCallback {aka Nexus::TReceiveCallback ()(Nexus::CData, Nexus::IMetaData*)}’|

这是设置语句:

typeAsyncReceiverCallback l_pPointer = AsyncRecieverReceived;

我定义了以下内容:

typedef TReceiveCallback (*typeAsyncReceiverCallback)(CData *a_pData, IMetaData *a_pMetaData);

class CSerialSniffer
{
...
public:
Nexus::TReceiveCallback AsyncRecieverReceived(Nexus::CData *a_pData, Nexus::IMetaData *a_pMetaData);
...
}

我已经在这里工作了几个小时了,有什么想法吗?

回应回答:我这里有同样的回调机制:

typedef void (*EnqueueCallback)( PData *pd );

class SomeClass
{
...
public:
void enqueue( PData *pd );
...
};


class CSerialSniffer
{
...
public:
void set_enqueue_callback(EnqueueCallback a_pEnqueueCallback );
...
}


SomeClass::SomeFunction(){
this->serialSniffer->set_enqueue_callback(this->enqueue);
}

而且它编译得很好。两者有什么区别?

最佳答案

你的 CSerialSniffer::AsyncRecieverReceived是一个成员函数。它不能在没有对象的情况下使用,因此要么将其设为自由函数(类外),要么将其设为静态函数:

class CSerialSniffer
{
...
public:
static Nexus::TReceiveCallback AsyncRecieverReceived(
Nexus::CData *a_pData,
Nexus::IMetaData *a_pMetaData);
...
};

typeAsyncReceiverCallback l_pPointer = &CSerialSniffer::AsyncRecieverReceived;

C++11 的一个更好的替代方法是使用 std::function<>相反:

typedef std::function<TReceiveCallback(CData*,IMetaData*)> 
typeAsyncReceiverCallback;

现在你可以通过绑定(bind)一个对象作为成员函数的第一个参数来创建一个自由函数:

CSerialSniffer snivver;

auto callback = std::bind(
std::mem_fun( &CSerialSniffer::AsyncRecieverReceived ),
&snivver );

这些东西都在里面 <functional>标题。

关于c++ - 提供一个方法作为回调函数 (gcc 4.7.1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12093118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com