在 C++/WinRT 项目中使用 CoreDispatcher::RunAsync 时获取 "a function that returns 'auto' cannot be used before it is defined"
Getting "a function that returns 'auto' cannot be used before it is defined" while using CoreDispatcher::RunAsync in C++/WinRT project
在我的 C++/WinRT 项目中,我试图在 UI 线程上 运行 一些代码,但收到一条错误消息:
"winrt::impl::consume_Windows_UI_Core_ICoreDispatcher<winrt::Windows::UI::Core::ICoreDispatcher>::RunAsync': a function that returns 'auto' cannot be used before it is defined"
我正在调用这样的方法:
Dispatcher().RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, [=]()
{
// Code to be executed.
});
实现来自自动生成的 winrt 文件,returns auto
作为 return 类型。
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;
};
我是否遗漏了什么或者这是一个错误?
这是对 C++/WinRT 库相当 new addition 的结果。在生成的文件中使用 return 类型推导将用于触发链接器错误的内容转变为编译器错误。出于以下几个原因,编译器错误是有利的:
- 早早发现构建错误。您不再需要等待编译器完成,只能在稍后的构建过程中看到链接器失败。
- 编译器可以查看源代码,并会发出导致错误的文件和行号以及类型名称。相比之下,链接器将包含损坏的类型名称,从而导致非常嘈杂的输出。
错误诊断的原因是 header 文件缺少 #include
指令,其中包含相关类型的完整定义。识别丢失的包含通常是直截了当的。错误消息包括缺少的类型名称,采用以下形式
winrt::impl::consume_<namespace1>_<namespace2>_..._<some_interface>
相应的 header 文件位于 winrt
目录下,其名称是 dot-separated 命名空间的串联,后跟 .h
.
在这种情况下,缺少的类型是
winrt::impl::consume_Windows_UI_Core_ICoreDispatcher<winrt::Windows::UI::Core::ICoreDispatcher>
所以你需要#include <winrt/Windows.UI.Core.h>
进入使用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 项目中,我试图在 UI 线程上 运行 一些代码,但收到一条错误消息:
"winrt::impl::consume_Windows_UI_Core_ICoreDispatcher<winrt::Windows::UI::Core::ICoreDispatcher>::RunAsync': a function that returns 'auto' cannot be used before it is defined"
我正在调用这样的方法:
Dispatcher().RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, [=]()
{
// Code to be executed.
});
实现来自自动生成的 winrt 文件,returns auto
作为 return 类型。
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;
};
我是否遗漏了什么或者这是一个错误?
这是对 C++/WinRT 库相当 new addition 的结果。在生成的文件中使用 return 类型推导将用于触发链接器错误的内容转变为编译器错误。出于以下几个原因,编译器错误是有利的:
- 早早发现构建错误。您不再需要等待编译器完成,只能在稍后的构建过程中看到链接器失败。
- 编译器可以查看源代码,并会发出导致错误的文件和行号以及类型名称。相比之下,链接器将包含损坏的类型名称,从而导致非常嘈杂的输出。
错误诊断的原因是 header 文件缺少 #include
指令,其中包含相关类型的完整定义。识别丢失的包含通常是直截了当的。错误消息包括缺少的类型名称,采用以下形式
winrt::impl::consume_<namespace1>_<namespace2>_..._<some_interface>
相应的 header 文件位于 winrt
目录下,其名称是 dot-separated 命名空间的串联,后跟 .h
.
在这种情况下,缺少的类型是
winrt::impl::consume_Windows_UI_Core_ICoreDispatcher<winrt::Windows::UI::Core::ICoreDispatcher>
所以你需要#include <winrt/Windows.UI.Core.h>
进入使用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”?.
的博客文章中提供了有关该主题的更多背景信息