typedef含unsigned char*参数的std::function时绑定报错,如何解决?
问题解决方法
核心原因
你的代码存在函数签名不匹配的问题:
- 定义的
func_t是std::function<int(unsigned char &)>,参数为unsigned char的引用 - 但
B::somefunction的参数是unsigned char *(指针),std::bind生成的函数对象签名与func_t完全不兼容,因此无法转换。
两种解决思路
思路1:修正func_t的签名(推荐,若实际需求是接收指针)
如果业务逻辑中函数确实需要接收unsigned char*类型参数,直接修改func_t定义,使其与B::somefunction的签名一致:
// 将引用改为指针 typedef std::function<int(unsigned char *)> func_t;
修改后,原std::bind代码可正常运行,绑定后的函数对象能直接存入func_list。
思路2:用Lambda做签名适配(若必须保留func_t的引用参数)
如果func_t的签名不能修改(必须接收unsigned char&),可以用Lambda表达式封装B::somefunction,完成引用到指针的转换:
A::init() { func_t f = [this](unsigned char &data) { // 将引用转为指针传给somefunction return b.somefunction(&data); }; func_list.push_back(f); }
Lambda的签名与func_t完全匹配,可直接存入vector。
补充说明
错误信息里提到的void(__thiscall B::*)(unsigned char *)是编译器报错时的类型显示细节,核心矛盾仍是引用与指针的签名不匹配,而非返回值类型错误(你的代码中B::somefunction声明为int返回是正确的)。
内容的提问来源于stack exchange,提问作者user1538798
相关产品推荐
相关产品推荐

