调用模板函数报错:无匹配getRecord成员函数求助
搞定
no matching member function for call to 'getRecord'的模板匹配问题 为啥会报错?
这问题我之前帮同事踩过坑!本质是模板参数推导卡壳了。你看候选模板的声明:
const char *getRecord(const T& item, void *filePtr, std::function<T(char*)> parseFn);
编译器需要同时从第一个参数player(std::string类型)和第三个参数(你的lambda)推导T。但lambda是个匿名的闭包类型,编译器没法直接把它和std::function<T(char*)>匹配——毕竟T还没确定呢,它总不能猜吧?
三种解决办法任你选
1. 直接告诉编译器T的类型
调用getRecord时显式指定模板参数,跳过推导环节:
return getRecord<std::string>(player, myVoidPtr, [](char* data) { // 这里写你的lambda逻辑,确保返回std::string就行 return std::string(data); });
2. 把lambda转成明确的std::function
先把lambda包装成指定类型的std::function,再传进去:
std::function<std::string(char*)> parseFunc = [](char* data) { return std::string(data); }; return getRecord(player, myVoidPtr, parseFunc);
3. 改模板函数(如果能改的话)
如果有权限修改getRecord的模板,把第三个参数改成模板参数,直接接受任何可调用对象,这是最灵活的方式:
template <typename T, typename ParseFunc> const char *getRecord(const T& item, void *filePtr, ParseFunc parseFn) { // 只要parseFn能接char*、返回T,怎么写都能适配 }
这样不仅能兼容lambda,函数指针、自定义functor都能用,还能避免std::function的一点点性能损耗。
最后检查下
别忘了确认你的lambda:
- 确实只接受一个
char*参数 - 返回值类型和
player的类型(std::string)完全一致
内容的提问来源于stack exchange,提问作者dylhunn
相关产品推荐
相关产品推荐

