C++ 给出一个作为回调函数的方法(gcc 4.7.1)
我试图将一个看似简单的回调方法指针设置到变量中,并得到以下错误: CSerialSniffer.cpp | 11 |错误:无法转换 来自类型的“CSerialSniffer::AsyncReceiveReceiveReceiveReceived” 'Nexus::TReceiveCallback(CSerialSniffer::)(Nexus::CData*, Nexus::IMetaData*)'}'|到类型“Nexus::TypeAsyncReceiveCallback{aka” Nexus::TReceiveCallback()(Nexus::CData,Nexus::IMetaData*)}'| 下面是set语句:C++ 给出一个作为回调函数的方法(gcc 4.7.1),c++,callback,gcc4.7,C++,Callback,Gcc4.7,我试图将一个看似简单的回调方法指针设置到变量中,并得到以下错误: CSerialSniffer.cpp | 11 |错误:无法转换 来自类型的“CSerialSniffer::AsyncReceiveReceiveReceiveReceived” 'Nexus::TReceiveCallback(CSerialSniffer::)(Nexus::CData*, Nexus::IMetaData*)'}'|到类型“Nexus::TypeAsyncReceiveCallback{aka” Nexus
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::asyncReceiveReceiveReceived
是一个成员函数。它不能在没有对象的情况下使用,因此您可以将其设置为自由函数(类外)或静态函数:
class CSerialSniffer
{
...
public:
static Nexus::TReceiveCallback AsyncRecieverReceived(
Nexus::CData *a_pData,
Nexus::IMetaData *a_pMetaData);
...
};
typeAsyncReceiverCallback l_pPointer = &CSerialSniffer::AsyncRecieverReceived;
CSerialSniffer snivver;
auto callback = std::bind(
std::mem_fun( &CSerialSniffer::AsyncRecieverReceived ),
&snivver );
C++11更好的替代方法是使用std::function
:
typedef std::function<TReceiveCallback(CData*,IMetaData*)>
typeAsyncReceiverCallback;
这些好东西在
标题中。您的CSerialSniffer::asyncReceiveReceiveReceived
是一个成员函数。它不能在没有对象的情况下使用,因此您可以将其设置为自由函数(类外)或静态函数:
class CSerialSniffer
{
...
public:
static Nexus::TReceiveCallback AsyncRecieverReceived(
Nexus::CData *a_pData,
Nexus::IMetaData *a_pMetaData);
...
};
typeAsyncReceiverCallback l_pPointer = &CSerialSniffer::AsyncRecieverReceived;
CSerialSniffer snivver;
auto callback = std::bind(
std::mem_fun( &CSerialSniffer::AsyncRecieverReceived ),
&snivver );
C++11更好的替代方法是使用std::function
:
typedef std::function<TReceiveCallback(CData*,IMetaData*)>
typeAsyncReceiverCallback;
这些好东西在它们的
标题中。您的回调声明
typeAsyncReceiverCallback
是正则函数,但是
asyncReceiveReceived
是一个方法(即,它需要“this”指针,而在c++中它无法以这种方式获得它)
将
AsyncReceiveReceived
更改为静态或使用观察者模式。您的回调声明
typeAsyncReceiverCallback
是正则函数,但是
asyncReceiveReceived
是一个方法(即,它需要“this”指针,而在c++中它无法以这种方式获得它)
要么将
asyncReceiveReceived
更改为static,要么使用observer模式。非常奇怪的是后者会编译。你确定它是编译的吗?嗯。它没有输出任何错误,但是项目还没有完全编译。我来验证一下-这里没有编译。好的。最后,我决定编译这个该死的项目。你说得对!谢谢很奇怪,后者会编译。你确定它是编译的吗?嗯。它没有输出任何错误,但是项目还没有完全编译。我来验证一下-这里没有编译。好的。最后,我决定编译这个该死的项目。你说得对!谢谢