In my C++/WinRT project, I am trying to run some code on UI thread but getting an error that says:
"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"
I am invoking the method like this:
Dispatcher().RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, [=]()
{
// Code to be executed.
});
The implementation is coming from auto generated winrt file which returns auto
as a return type.
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;
};
Is there something that I am missing or is this a bug?
This is the result of a fairly new addition to the C++/WinRT library. Using return type deduction in the generated files turns what used to trigger a linker error into a compiler error. A compiler error is favorable for several reasons:
The reason for the error diagnostic is a missing
#include
directive for the header file that contains the full definition of the type in question. Identifying the missing include is usually straight forward. The error message includes the missing type name, taking the following formThe respective header file is underneath the
winrt
directory, whose name is the dot-separated concatenation of namespaces, followed by.h
.In this case the missing type is
so you need to
#include <winrt/Windows.UI.Core.h>
into the compilation unit that's using theICoreDispatcher
interface.Raymond Chen has more background information on the topic in his blog entry titled Why does my C++/WinRT project get errors of the form “consume_Something: function that returns ‘auto’ cannot be used before it is defined”?.