Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.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++ 给出一个作为回调函数的方法(gcc 4.7.1)_C++_Callback_Gcc4.7 - Fatal编程技术网

C++ 给出一个作为回调函数的方法(gcc 4.7.1)

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

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

CSerialSniffer.cpp | 11 |错误:无法转换 来自类型的“CSerialSniffer::AsyncReceiveReceiveReceiveReceived” 'Nexus::TReceiveCallback(CSerialSniffer::)(Nexus::CData*, Nexus::IMetaData*)'}'|到类型“Nexus::TypeAsyncReceiveCallback{aka” Nexus::TReceiveCallback()(Nexus::CData,Nexus::IMetaData*)}'|

下面是set语句:

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模式。

非常奇怪的是后者会编译。你确定它是编译的吗?嗯。它没有输出任何错误,但是项目还没有完全编译。我来验证一下-这里没有编译。好的。最后,我决定编译这个该死的项目。你说得对!谢谢很奇怪,后者会编译。你确定它是编译的吗?嗯。它没有输出任何错误,但是项目还没有完全编译。我来验证一下-这里没有编译。好的。最后,我决定编译这个该死的项目。你说得对!谢谢