C ++ / WinRT Coroutine не компилируется из-за проблемы с преобразованием типов - PullRequest
0 голосов
/ 05 мая 2020

Я начал использовать C ++ / WinRT и хочу реализовать сопрограмму, вызывающую функцию LaunchFileAsyn c. Но мой код не компилируется, и я понятия не имею, почему.

#include <pch.h>
#include <winrt/Windows.System.h>
#include <winrt/Windows.Storage.h>

using namespace winrt;
using namespace Windows::System;
using namespace Windows::Storage;
using namespace Windows::Foundation;

Windows::Foundation::IAsyncOperation<bool> ActionOnClick()
{
    const auto uri = Uri(L"URI");
    const auto storageFile{ co_await StorageFile::GetFileFromApplicationUriAsync(uri) };

    co_return Launcher::LaunchFileAsync(storageFile);
}

Согласно https://docs.microsoft.com/en-us/uwp/api/windows.system.launcher.launchfileasync?view=winrt-18362, Launcher :: LaunchFileAsyn c возвращает IAsyncOperation, но компилятор выдает следующую ошибку:

1>E:ExamplesConsoleApplication1\ConsoleApplication1\main.cpp(16,1): error C2664: "void std::experimental::coroutine_traits<winrt::Windows::Foundation::IAsyncOperation<bool>>::promise_type::return_value(const TResult &) noexcept": argument 1 cannot be converted from "winrt::Windows::Foundation::IAsyncOperation<bool>" to "TResult &&"
1> with
1> [
1> TResult=bool
1> ]
1>E:Examples\ConsoleApplication1\ConsoleApplication1\main.cpp(16,1): message : Cause: Can't be converted from "winrt::Windows::Foundation::IAsyncOperation<bool>" to "TResult"
1> with
1> [
1> TResult=bool
1> ]
1>E:\Examples\ConsoleApplication1\ConsoleApplication1\main.cpp(16,40): message : No user-defined conversion operator is available to perform this conversion or the operator cannot be called

Что проблема?

1 Ответ

1 голос
/ 05 мая 2020

Код пытается вернуть ожидаемый объект, а не возвращаемое значение. Вам нужно будет сначала co_await результат, прежде чем вы сможете co_return его:

Windows::Foundation::IAsyncOperation<bool> ActionOnClick()
{
    const auto uri = Uri(L"URI");
    const auto storageFile{ co_await StorageFile::GetFileFromApplicationUriAsync(uri) };

    auto const result{ co_await Launcher::LaunchFileAsync(storageFile) };
    co_return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...