【问题标题】:variable cannot be implicitly captured in a lambda with no capture-default specified using a switch statement在没有使用 switch 语句指定捕获默认值的 lambda 中隐式捕获变量
【发布时间】:2019-09-28 19:44:22
【问题描述】:

我正在尝试将名称转换为数字。我的问题是,当我尝试在 switch 语句中执行简单的a=a+1 时,我收到错误消息“无法在未指定捕获默认值的 lambda 中隐式捕获变量‘a’”

在这里寻找相同的错误消息,我发现我应该使用[][=][&]。我的问题似乎更多的是如何以及在哪里这样做。如果我去[](int a=0){}; 初始化变量,那么我的消息是“错误:使用未声明的标识符'a'”

这是我的问题的代码

#include <jni.h>
#include <string>
#include <iostream>
#include <iomanip>
#include <sstream>
using namespace std;

static int nameToNumber(string fn, string ln)
{
    string nameOne = fn;
    string nameTwo = ln;
    [](int a=0){};
    int b = 0;
    int num = 0;

    for_each(nameOne.begin(), nameOne.end(), [](char &c )
    {
        c=::toupper(c);

        switch (c){

            case 'A':
            case 'J':
            case 'S': a=a+1;
                break;
            case 'B':
            case 'K':
            case 'T': a=a+2;
                break;
            case 'C':
            case 'L':
            case 'U': a=a+3;
                break;
            case 'D':
            case 'M':
            case 'V': a=a+4;
                break;
            case 'E':
            case 'N':
            case 'W': a=a+5;
                break;
            case 'F':
            case 'O':
            case 'X': a=a+6;
                break;
            case 'G':
            case 'P':
            case 'Y': a=a+7;
                break;
            case 'H':
            case 'Q':
            case 'Z': a=a+8;
                break;
            case 'I':
            case 'R': a=a+9;
                break;
            default: a=a+0;
        }
    });


    for_each(nameTwo.begin(), nameTwo.end(), [](char &c)
    {


        c=::toupper(c);
        switch (c){

            case 'A':
            case 'J':
            case 'S': b=b+1;
                break;
            case 'B':
            case 'K':
            case 'T': b=b+2;
                break;
            case 'C':
            case 'L':
            case 'U': b=b+3;
                break;
            case 'D':
            case 'M':
            case 'V': b=b+4;
                break;
            case 'E':
            case 'N':
            case 'W': b=b+5;
                break;
            case 'F':
            case 'O':
            case 'X': b=b+6;
                break;
            case 'G':
            case 'P':
            case 'Y': b=b+7;
                break;
            case 'H':
            case 'Q':
            case 'Z': b=b+8;
                break;
            case 'I':
            case 'R': b=b+9;
        }
    });

num = a + b;
if ((num > 9) && (num != 11) && (num != 22) && (num != 33))
{
//add both digits together to get a single digit
a=0;
b=0;

a = num / 10; //get first digit
b = num % 10; //get second digit
num = a + b; //add them together
}
return num;
}

这就是我所说的

extern "C" JNIEXPORT jstring JNICALL
Java_com_sezju_namenumerology_MainActivity_transformInfo(
        JNIEnv *env,
        jobject /* this */,
        jstring fName,
        jstring lName,
        jint age) {
int luckynum = nameToNumber(jstringToString(env, fName), jstringToString(env, lName));
string message = jstringToString(env, fName) + " " + jstringToString(env, lName) + ".\n";
message += "You are " + decToHexa((int)age)+ " years old in hexadecimal. \n";
message += "Your number is " + std::to_string(luckynum) + " \n";
return env->NewStringUTF(message.c_str());

我的预期结果是,输入的名称的结果为单个数字,即 11、22 或 33。

【问题讨论】:

  • 请创建一个minimal reproducible example。是否需要所有这些案例来解决您的问题?我不这么认为。
  • 不要使用for_each,使用简单的for,你不需要任何lambda
  • 我认为你可以使用for(auto c : nameOne) 来做foreach
  • [&amp;](char &amp;c )
  • [](int a=0){};的目的是什么?

标签: c++ c++11


【解决方案1】:

Lambda 有一个封闭的范围。要访问父级的范围,您需要指定捕获默认值&amp;=,如下所示:

[&](char &c) {};
// or
[=](char &c) {};

来自https://en.cppreference.com/w/cpp/language/lambda

&:通过引用隐式捕获使用的自动变量。
=:通过复制隐式捕获使用的自动变量。

【讨论】:

    【解决方案2】:

    您需要通过引用使用捕获,即 [&amp;] 用于两个 lambda。您还需要声明int a = 0;

    请注意,[](int a=0){}; 语句没有作用,在其参数中声明的变量a 在语句之外是不可见的。

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 2021-06-02
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多