C++使用Lambda时报错temp1Ord无法隐式捕获该如何解决
C++ Lambda捕获报错问题解决方案
错误根因
你遇到的报错有两个核心原因:
- 嵌套lambda的内层需要访问外层lambda的参数
temp1Ord,你没有为内层lambda配置对应捕获规则,编译器找不到temp1Ord的引用来源。 - 你当前定义的
ForEachLista第二个参数是普通函数指针类型,只有无捕获的lambda才能隐式转换为普通函数指针,只要lambda添加了捕获逻辑,就无法再匹配函数指针类型,这也是你之前只加&仍报错的原因。
修复步骤
步骤1:修改ForEachLista的模板定义与前置声明
新增可调用对象模板参数,兼容带捕获的lambda,无需固定为函数指针类型。
- 原前置声明修改为:
template <typename T, typename Func> void ForEachLista(T *lista, Func func);
- 原函数实现修改为:
template <typename T, typename Func> void ForEachLista(T *lista, Func func){ T* temp = lista; while (temp != nullptr) { func(temp); temp = temp->next; } }
步骤2:修改嵌套lambda的捕获规则
为内层lambda添加捕获规则,让它可以访问外层lambda的temp1Ord参数:
ForEachLista<Numero>(primo, [](Numero* temp1Ord){ // 内层lambda通过引用捕获外层的temp1Ord ForEachLista<Numero>(temp1Ord->next, [&temp1Ord](Numero* temp2Ord){ if (temp1Ord->numero > temp2Ord->numero) { int temp = temp1Ord->numero; temp1Ord->numero = temp2Ord->numero; temp2Ord->numero = temp; } }); });
修改完成后即可正常编译运行,链表排序、重复值筛选逻辑均可正常执行。
内容的提问来源于stack exchange,提问作者Jad
相关产品推荐
相关产品推荐

