传递模板类成员函数指针集合的编译问题及修正求助
问题分析与修正
核心问题梳理
- 模板类实例化缺失参数:
Points p;未指定模板参数D,模板类必须明确传入实例化参数才能使用 - 成员函数指针类型不匹配:
- 原
fptr的typedef未绑定模板实例Points<D>,导致类型和实际成员函数指针不兼容 execute_all接收std::vector<void (Points::*)()>,但传入的是std::set<fptr<D>>,容器类型与内部元素类型均不匹配
- 原
- 输出逻辑错误:原代码中
"D \n"只是固定字符串,无法输出模板参数D的实际值
修正后的可运行代码
#include<iostream> #include<vector> #include<set> template<int D> class Points{ public: std::vector<int> data; void func1() { std::cout<<"Operation 1 with D = "<< D <<"\n"; } void func2() { std::cout<<"Operation 2 with D = "<< D <<"\n"; } // 适配模板实例的成员函数指针vector参数 void execute_all(std::vector<void (Points<D>::*)()> flist) { for (auto f: flist){ (this->* f)(); } } // 重载版本,直接接收set容器 void execute_all(const std::set<void (Points<D>::*)()>& flist) { for (auto f: flist){ (this->* f)(); } } }; // 修正typedef,绑定到对应模板实例的成员函数指针 template<int D> using fptr = void (Points<D>::*)(); int main() { constexpr int D = 2; // 补充变量类型声明 Points<D> p; // 正确实例化模板类 std::set<fptr<D>> functionlist; functionlist.insert(&Points<D>::func1); functionlist.insert(&Points<D>::func2); p.execute_all(functionlist); // 也可以使用vector调用原版本execute_all std::vector<fptr<D>> func_vec{&Points<D>::func1, &Points<D>::func2}; p.execute_all(func_vec); return 0; }
关键修改说明
- 模板实例化修正:将
Points p;改为Points<D> p;,明确传入模板参数完成实例化 - 成员函数指针类型对齐:
fptr的typedef调整为void (Points<D>::*)(),确保与实际成员函数指针类型匹配 - 容器兼容处理:给
execute_all增加接收std::set的重载版本,无需额外转换即可传入set容器 - 输出逻辑修复:将
"D \n"改为<< D <<"\n",正确输出模板参数D的数值 - 变量类型补全:
constexpr D = 2;补充int类型声明,符合C++语法规范
内容的提问来源于stack exchange,提问作者Prapanch Nair
相关产品推荐
相关产品推荐

