使用C++11转发函数时为何出现“候选期望2个实参,仅提供1个”编译错误?
错误原因分析
你的编译错误根源在于函数模板的参数顺序逻辑问题:模板参数包Args&&... args后面跟着带默认值的int foo_0 = 0,编译器无法正确推导Args的参数。当你调用do_something_1(1, lambda, 4)时,编译器会把4当作foo_0的默认参数替代值,而Args被推导为空。这导致调用lambda时只传入了var_1一个参数,但你的lambda需要两个参数,因此触发参数不匹配的错误。
修正方案
方案1:重载函数,分离默认参数逻辑
通过重载两个版本的do_something_1,一个带foo_0参数,一个不带(默认使用foo_0=0),让编译器可以明确推导参数包:
#include <functional> // 无foo_0参数的版本,默认使用foo_0=0 template<typename Func, typename... Args> int do_something_1(int foo_1, Func&& func, Args&&... args) { return do_something_1(foo_1, 0, std::forward<Func>(func), std::forward<Args>(args)...); }; // 带foo_0参数的核心实现 template<typename Func, typename... Args> int do_something_1(int foo_1, int foo_0, Func&& func, Args&&... args) { int var_1 = foo_0 + 2 * foo_1; return std::forward<Func>(func)(var_1, std::forward<Args>(args)...); }; int main(void) { return do_something_1(1, [](int var_1, int local_var) { return var_1 + local_var; }, 4); }
方案2:调整参数顺序,让参数包位于最后
将带默认值的foo_0移到参数包之前,明确区分Args参数和foo_0:
#include <functional> 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; return std::forward<Func>(func)(var_1, std::forward<Args>(args)...); }; int main(void) { // 显式传递foo_0=0,或替换为你需要的数值 return do_something_1(1, 0, [](int var_1, int local_var) { return var_1 + local_var; }, 4); }
内容的提问来源于stack exchange,提问作者Medical physicist
相关产品推荐
相关产品推荐

