在 C++/WinRT 项目中使用 CoreDispatcher::RunAsync 时获取“在定义之前无法使用返回‘auto’的函数”

Posted

技术标签:

【中文标题】在 C++/WinRT 项目中使用 CoreDispatcher::RunAsync 时获取“在定义之前无法使用返回‘auto’的函数”【英文标题】:Getting "a function that returns 'auto' cannot be used before it is defined" while using CoreDispatcher::RunAsync in C++/WinRT project 【发布时间】:2019-12-18 09:11:05 【问题描述】:

在我的 C++/WinRT 项目中,我尝试在 UI 线程上运行一些代码,但收到一条错误消息:

“winrt::impl::consume_Windows_UI_Core_ICoreDispatcher<:windows::ui::core::icoredispatcher>::RunAsync':返回'auto'的函数在定义之前不能使用”

我正在调用这样的方法:

Dispatcher().RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, [=]()

     // Code to be executed.
);

实现来自自动生成的 winrt 文件,该文件返回 auto 作为返回类型。

template <typename D>
struct consume_Windows_UI_Core_ICoreDispatcher

    [[nodiscard]] auto HasThreadAccess() const;
    auto ProcessEvents(Windows::UI::Core::CoreProcessEventsOption const& options) const;
    auto RunAsync(Windows::UI::Core::CoreDispatcherPriority const& priority, Windows::UI::Core::DispatchedHandler const& agileCallback) const;
    auto RunIdleAsync(Windows::UI::Core::IdleDispatchedHandler const& agileCallback) const;
;

是我遗漏了什么还是这是一个错误?

【问题讨论】:

【参考方案1】:

这是相当 new addition 到 C++/WinRT 库的结果。在生成的文件中使用返回类型推导会将用于触发链接器错误的内容转换为编译器错误。编译器错误是有利的,原因如下:

早期构建错误。您不再需要等待编译器完成,而只是在构建过程的后期看到链接器失败。 编译器可以查看源代码,并会在类型名称旁边发出导致错误的文件和行号。相比之下,链接器将包含损坏的类型名称,从而导致非常嘈杂的输出。

错误诊断的原因是缺少包含所讨论类型的完整定义的头文件的#include 指令。识别缺失的包含通常是直截了当的。错误消息包括缺少的类型名称,采用以下形式

winrt::impl::consume___..._

各自的头文件在winrt目录下,其名称是点分隔的命名空间串联,后跟.h

在这种情况下,缺少的类型是

winrt::impl::consume_Windows_UI_Core_ICoreDispatcher<:windows::ui::core::icoredispatcher>

所以你需要将#include &lt;winrt/Windows.UI.Core.h&gt; 加入到使用ICoreDispatcher 接口的编译单元中。

Raymond Chen 在其标题为Why does my C++/WinRT project get errors of the form “consume_Something: function that returns ‘auto’ cannot be used before it is defined”? 的博客文章中提供了有关该主题的更多背景信息。

【讨论】:

以上是关于在 C++/WinRT 项目中使用 CoreDispatcher::RunAsync 时获取“在定义之前无法使用返回‘auto’的函数”的主要内容,如果未能解决你的问题,请参考以下文章

如何在“native c ++”环境中使用WinRT IAsyncOperation *对象

带有WinRT C ++构建问题的Qt

不能在 Metro 风格项目(WINRT)中使用 opencl

如何在带有 ARM CPU 的 WinRT 设备中部署 SQLite?

无法将运行时类绑定到XAML T必须是WinRT类型

在 WinRT 中检查项目中是不是存在文件