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; }); }
关键修改说明
- 调整
do_something_1参数顺序:把带默认值的foo_0移到模板参数包前面,确保编译器能正确推导Args类型。 - 修正
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
相关产品推荐
相关产品推荐

