C++如何将一个函数的输出传入另一函数及报错问题解析
报错根本原因
你遇到的类型不匹配报错,核心是两个写法错误导致的:
- 传参逻辑错误:你调用sum时写的是
sum(1,5,function(x)),这不是把function函数传给sum,而是当场调用function(x)、把调用后的int类型返回值传给sum。但sum的第三个参数要求的是接收一个函数(实际会退化为函数指针,类型为int (*)(int),即指向“入参为int、返回值为int”的函数的指针),int类型的值和函数指针类型完全不兼容,就会触发你看到的报错。 - 目标函数语法错误:你示例里写的
int function(x){ return 2*x;}不符合C++语法规范,函数的形参必须明确标注类型,漏写x的int类型会直接导致编译失败。
另外你原代码里sum的第三个参数写法int function(int input)本身语法是合法的——C++中函数作为形参时会自动退化为函数指针,只是你传参的时候传错了值,才触发了类型错误。
最简可运行实现
直接用匹配的函数指针做形参即可,完整可运行代码如下:
// 求和函数:第三个参数明确声明为对应类型的函数指针 int sum(int start, int end, int (*func)(int)) { int total = 0; for (int i = start; i < end; i++) { total += func(i); // 遍历区间值,传入目标函数拿返回值累加 } return total; } // 自定义目标函数,必须明确标注形参类型 int double_num(int x) { return 2 * x; } // 调用示例 int main() { // 注意:传目标函数时只写函数名,不要加括号、不要传调用实参 int result = sum(1, 5, double_num); // 计算逻辑:2*1 + 2*2 + 2*3 + 2*4 = 2+4+6+8 = 20,你之前算的10属于累加计算错误 return 0; }
实现原理说明
- C++中,单独写函数名(不带括号、不传入调用参数)时,会自动解析为该函数在内存中的起始地址,也就是对应类型的函数指针,正好匹配sum第三个参数的类型要求,不会出现类型冲突。
- sum函数内部拿到函数指针后,在for循环遍历[start, end)区间的每个整数i时,通过该指针调用传入的目标函数,把i作为参数传入拿到单次调用的返回值,逐次累加到总和变量中,循环结束后返回最终累加结果即可。
- 只要是符合「入参为1个int类型、返回值为int类型」规则的自定义函数,都可以直接把函数名传给sum使用,不需要修改sum的内部逻辑。
内容的提问来源于stack exchange,提问作者alienare 4422
相关产品推荐
相关产品推荐

