我正在尝试为一个函数设置一个委托,并通过以下两个类来实现。
底部是我遇到的错误。我该如何处理?
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);
答案 0 :(得分:6)
std::bind
函数返回不兼容或可转换为指向非成员函数的指针的对象。
代替使用std::function
:
using SocketEventString = std::function<void(String)>;
具有定义
typedef void (*SocketEventString) (String);
您说SocketEventString
是指向非成员函数(即,不是类或结构中的成员的函数)的指针,该函数接受类型为String
的一个参数,并且不返回任何值。 / p>
std::bind
函数返回一个未知类的对象。该对象与您定义的SocketEventString
的指针类型不同。
两种类型(SocketEventString
和std::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