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

C++11转发函数时编译错误:模板与Lambda变量使用问题

问题分析与解决

错误原因

编译报错的核心是两个问题:

  • do_something_2的return语句里,你错误地直接调用了lambda表达式:std::forward<Func>(func)(var_2, ...),但你的lambda需要2个参数,此时仅传入var_2一个,触发参数不匹配错误。
  • do_something_1的参数顺序违规:模板参数包Args&&... args后面不能跟带默认值的参数int foo_0 = 0,这会导致编译器无法正确推导模板参数。

修正后的代码

#include <functional>

// 调整参数顺序:将默认参数foo_0移至模板参数包之前
template<typename Func, typename... Args>
int do_something_1(int foo_1, int foo_0 = 0, Func&& func, Args&&... args) { 
    int var_1 = foo_0 + 2 * foo_1; 
    // 传入var_1和后续参数给lambda
    return std::forward<Func>(func)(var_1, std::forward<Args>(args)...);
};

template<typename Func, typename... Args>
int do_something_2(int foo_2, Func&& func, Args&&... args) { 
    int var_2 = 10 - foo_2; 
    // 直接传递func和var_2给do_something_1,而非提前调用lambda
    return do_something_1(3, 0, std::forward<Func>(func), var_2, std::forward<Args>(args)...);
};

int main (void) {
    return do_something_2(1, [](int var_1, int var_2) { return var_1 * var_2; });
}

关键修改说明

  1. 调整do_something_1参数顺序:把带默认值的foo_0移到模板参数包前面,确保编译器能正确推导Args类型。
  2. 修正do_something_2调用逻辑:不再提前执行lambda,而是将lambda和var_2作为参数传递给do_something_1,让do_something_1计算出var_1(值为6)后,再将var_1和var_2(值为9)一起传入lambda,最终得到预期结果54。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:45:29