我正在尝试为一个函数设置一个委托,并有两个以下的类来实现它.
在底部是我得到的错误.我该如何处理?
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)
该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.
| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |