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

类成员函数中调用指向同类成员的函数指针报错求助

问题分析与代码修正

错误原因

你遇到的错误存在两个核心问题:

  1. 成员函数指针调用语法错误:类的非静态成员函数指针必须通过类对象(或成员函数内部的this指针)调用,直接写Result(20.2, 10)不符合语法要求——成员函数隐含this指针,必须明确指定调用对象。
  2. 函数签名不匹配:你传递的&CLASS_A::Calculate是指向double(int)类型成员函数的指针,但Determine的参数声明为double(CLASS_A::*Result)(double, int),两者参数数量、类型完全不匹配,这也是编译报错的潜在问题。

修正后的完整代码

class CLASS_A
{
private:
  // 修正Calculate的签名,与成员函数指针类型匹配
  double Calculate(double d, int weldPt);
  double Determine(double lb, double ub, double(CLASS_A::*Result)(double, int));
}; // 补全类声明末尾的分号

double CLASS_A::Calculate(double d, int weldPt)
{
  double LB, UB;
  // ...  
  double x = Determine(LB, UB, &CLASS_A::Calculate); // 此时签名匹配
  // ...
}

double CLASS_A::Determine(double lb, double ub, double(CLASS_A::*Result)(double, int))
{
  // ...
  // 使用this指针调用成员函数指针,括号不可省略(操作符优先级问题)
  double X = (this->*Result)(20.2, 10); 
  // ...
}

关键修正点说明

  • 类声明末尾分号:C++类声明必须以分号结尾,原代码遗漏会导致编译错误。
  • 函数签名对齐:确保传递的成员函数指针与参数声明的类型完全一致,这里调整了Calculate的参数列表,使其接受double和int两个参数,与Determine的函数指针参数匹配。
  • 成员函数指针调用方式:在成员函数内部,使用(对象->*函数指针)(参数)的语法调用成员函数指针;如果是直接操作对象实例,则用(对象.*函数指针)(参数)。括号必须加,因为函数调用的优先级高于->*/.*操作符,不加括号会导致语法解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:40:19