std::function能否作为类数据成员?附异常代码求助
问题分析与修复方案
首先,你的代码有两个主要问题导致无法运行:模板参数匹配错误,以及缺少必要的头文件引用。让我一步步帮你解决:
1. 缺少必要的头文件
你的代码使用了std::function和std::cout,但没有包含对应的头文件,这会直接导致编译失败。需要在代码开头添加:
#include <functional> #include <iostream>
2. 模板参数实例化不匹配
你定义的CallBack模板是分开接收返回值类型R和参数包Args...的:
template<class R, class... Args> class CallBack { ... };
但你实例化时却传入了一个完整的函数类型int(int,int)作为单个模板参数:
CallBack<int(int,int)> x(tmp); // 这里不匹配模板的参数列表
编译器无法把int(int,int)拆解成R和Args...,所以会报错。
修复方式一:按模板定义的参数列表实例化
直接传入返回值类型和参数类型,把实例化代码改成:
CallBack<int, int, int> x(tmp);
这样模板就能正确推导R=int,Args...为int, int。
修复方式二:修改模板支持函数签名式实例化
如果你更习惯用int(int,int)这种函数签名来实例化类,可以通过模板特化实现:
#include <functional> #include <iostream> // 主模板,仅用于匹配函数类型 template<typename Func> class CallBack; // 特化版本,解析函数类型为返回值和参数包 template<class R, class... Args> class CallBack<R(Args...)> { protected: std::function<R(Args...)> myFunc; public: CallBack(std::function<R(Args...)> funcIn) : myFunc(funcIn) {} virtual ~CallBack() {} R call(Args... args) { return myFunc(args...); } }; int main() { std::function<int(int,int)> tmp = [](int y, int z){return y + z + 2;}; CallBack<int(int,int)> x(tmp); // 现在可以正常使用函数签名实例化了 std::cout << x.call(12, 7); // 输出结果应该是21 return 0; }
这样修改后,你的代码就能正常编译运行,输出12+7+2=21。
另外补充一点:std::function完全可以作为类的数据成员,你的这个用法思路是没问题的,只是模板实例化的细节没处理对~
内容的提问来源于stack exchange,提问作者Benjamin Barrois
相关产品推荐
相关产品推荐

