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



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

我的项目中的示例代码片段,智能感知已经标记了出现"[this]"的每一行。错误/错误读取

无法将 lambda 捕获的类型为 "MainPage^*" 的变量复制到类型为 "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 += "rn!EXCEPTION CAUGHT! " + ex->Message;
}
});
}

好的,我设法偶然发现了一个有点丑陋的黑客来解决这个问题。

我没有将[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 += "rn!EXCEPTION CAUGHT! " + ex->Message;
}
});

}

希望这是有用的。

如果是这样,那么为什么要在任务之外复制呢?你可以做

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 += "rn!EXCEPTION CAUGHT! " + ex->Message;
}
});
}

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

相关内容

  • 没有找到相关文章

最新更新