std :: bind“呼叫没有匹配功能”

时间:2019-01-21 17:41:13

标签: c++

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

A级

typedef void (*SocketEventString) (String);

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


    private:
        SocketEventString _onMessage;

};

B类

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

//Constructor
BoardManager::BoardManager() {

    io.onMessage(  std::bind( &BoardManager::handleAction, this, std::placeholders::_1 ) );
}

错误

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

2 个答案:

答案 0 :(得分:6)

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

代替使用std::function

using SocketEventString = std::function<void(String)>;

具有定义

typedef void (*SocketEventString) (String);

您说SocketEventString是指向非成员函数(即,不是类或结构中的成员的函数)的指针,该函数接受类型为String的一个参数,并且不返回任何值。 / p>

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

两种类型(SocketEventStringstd::bind返回的对象)不兼容。您无法从一种类型转换为另一种类型。

编译器告诉您这一点,因为它试图找到一个函数SocketIO::onMessage,该函数采用std::bind返回的对象的类型,而找不到任何此类重载。

您需要使用与SocketEventString返回的对象兼容的类型,而不是您定义的std::bind类型。这就是我上面在答案中显示的内容,将SocketEventString定义为其他类型,该类型与std::bind返回的类型兼容。

答案 1 :(得分:1)

首先,您不能将C函数指针用于这样的C ++函数绑定。本质上,当您使用'3*a' b c时,它将捕获要在函数调用中使用的一些变量(例如bind),因此,如果要绑定,则需要使用this处理捕获的变量成员函数(因为成员函数至少需要捕获std::function指针)。另外,我认为this非常难看,我建议您熟悉新的C ++ lambda。

std::bind