std :: bind"没有匹配的调用函数"

dwa*_*man 1 c++

我正在尝试为一个函数设置一个委托,并有两个以下的类来实现它.
在底部是我得到的错误.我该如何处理?

A级

typedef void (*SocketEventString) (String);

class SocketIO 
{
    public:
        SocketIO();
        void onMessage(SocketEventString _cb);


    private:
        SocketEventString _onMessage;

};
Run Code Online (Sandbox Code Playgroud)

B级

class BoardManager 
    {
        public:
            BoardManager();
            void handleAction(String action);
            SocketIO io;
    };

//Constructor
BoardManager::BoardManager() {

    io.onMessage(  std::bind( &BoardManager::handleAction, this, std::placeholders::_1 ) );
}
Run Code Online (Sandbox Code Playgroud)

错误

sketch/BoardManager.cpp: In member function 'void BoardManager::initializeSocketIO()':
BoardManager.cpp:68: error: no matching function for call to 'SocketIO::onMessage(std::_Bind_helper<false, void (BoardManager::*)(String), BoardManager* const, const std::_Placeholder<1>&>::type)'
     io.onMessage(  std::bind( &BoardManager::handleAction, this, std::placeholders::_1 ) );
                                                                                          ^
sketch/BoardManager.cpp:68:90: note: candidate is:
In file included from sketch/BoardManager.h:10:0,
                 from sketch/BoardManager.cpp:8:
sketch/SocketIO.h:25:18: note: void SocketIO::onMessage(SocketEventString)
             void onMessage(SocketEventString _cb);
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 6

std::bind函数返回一个兼容或可转换为非成员函数指针的对象.

而是使用std::function:

using SocketEventString = std::function<void(String)>;
Run Code Online (Sandbox Code Playgroud)

随着定义

typedef void (*SocketEventString) (String);
Run Code Online (Sandbox Code Playgroud)

你说这SocketEventString是一个指向非成员函数的指针(即函数不是类或结构中的成员),它接受一个类型的参数String并且不返回任何值.

std::bind函数返回未知类的对象.该对象与您定义的指针类型不同SocketEventString.

这两种类型(SocketEventString以及返回的对象std::bind)不兼容.您无法将其中一种类型转换为另一种类型.

编译器告诉你这一点,因为它试图找到一个函数SocketIO::onMessage,它接受返回的对象的类型,std::bind并且没有找到任何这样的重载.

SocketEventString您需要使用与返回的对象兼容的类型,而不是您定义的类型std::bind.这就是我在上面的答案中所展示的SocketEventString,它被定义为一种不同的类型,一种与返回的类型兼容的类型std::bind.