You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传递模板类成员函数指针集合的编译问题及修正求助

问题分析与修正

核心问题梳理

  • 模板类实例化缺失参数: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;
}

关键修改说明

  1. 模板实例化修正:将Points p;改为Points<D> p;,明确传入模板参数完成实例化
  2. 成员函数指针类型对齐:fptr的typedef调整为void (Points<D>::*)(),确保与实际成员函数指针类型匹配
  3. 容器兼容处理:给execute_all增加接收std::set的重载版本,无需额外转换即可传入set容器
  4. 输出逻辑修复:将"D \n"改为<< D <<"\n",正确输出模板参数D的数值
  5. 变量类型补全:constexpr D = 2;补充int类型声明,符合C++语法规范

内容的提问来源于stack exchange,提问作者Prapanch Nair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:40:14