E1740无法将类型为“ ...”的lambda捕获变量复制到类型为“ ...”的闭包类字段中

时间:2019-11-22 15:38:06

标签: visual-studio uwp c++-cli

我最近安装了VS 2019,并打开了在VS 2017中创建的项目。该软件可以正常运行,但VS中存在lambda捕获变量的错误。 MS显然知道了上述问题,但是我想知道最近是否有人遇到过这个问题,如果有,您是否能够解决?

我的项目中的示例代码,智能感知已经标记了出现“ [this]”的每一行。错误/错误显示为

  

类型为“ MainPage ^ *”的lambda捕获变量无法复制到类型为“ MainPage ^”的闭包类字段中

if (_serialPort1 != nullptr)
{
    concurrency::create_task(WriteToSerialDeviceAsync(cancellationTokenSource_serialPort1->get_token(),
        Arduino_Device.Outgoing_Bytes, PORT_1)).then([this](concurrency::task<void> previousTask) {
        try
        {
            previousTask.get();
        }

        catch (Platform::COMException^ ex)
        {
            this->DataStreamWindow->Text += "\r\n!EXCEPTION CAUGHT! " + ex->Message;
        }
    });
}

2 个答案:

答案 0 :(得分:1)

好吧,我设法找到了一个难看的骇客来解决这个问题。

我没有将[this]传递给lambda,而是在创建任何任务之前添加了行auto _this = this;。但是,这确实意味着使用this->SomeVariable访问的所有变量都变成了_this->SomeVariable

所以我上面的示例现在看起来像这样。

if (_serialPort1 != nullptr)
{

auto _this = this;

concurrency::create_task(WriteToSerialDeviceAsync(cancellationTokenSource_serialPort1->get_token(),
    Arduino_Device.Outgoing_Bytes, PORT_1)).then([_this](concurrency::task<void> previousTask) {
    try
    {
        previousTask.get();
    }

    catch (Platform::COMException^ ex)
    {
        _this->DataStreamWindow->Text += "\r\n!EXCEPTION CAUGHT! " + ex->Message;
    }
});

}

希望这是有用的。

答案 1 :(得分:0)

如果是,那么为什么要在任务之外进行复制?您可以

if (_serialPort1 != nullptr)
{   concurrency::create_task(WriteToSerialDeviceAsync(cancellationTokenSource_serialPort1->get_token(),
        Arduino_Device.Outgoing_Bytes, PORT_1)).then([_this = this](concurrency::task<void> previousTask) {
        try
        {
            previousTask.get();
        }
        catch (Platform::COMException^ ex)
        {
            _this->DataStreamWindow->Text += "\r\n!EXCEPTION CAUGHT! " + ex->Message;
        }
    });
}

但是根据您的问题,这不是正确的解决方案。您最好找到将项目迁移到VS 2019的问题所在。