编译器错误 C3779

“function”: 若要使用将会返回“auto or decltype(auto)”的函数,必须先定义此函数

无法推断指定函数调用的 auto 返回类型。 编译器在调用站点上没有足够的信息。

备注

调用具有 auto 返回类型但没有正文或尾部返回类型的转发声明成员函数时,可能会出现此错误。 如果编译器在实例化模板专用化时找不到候选返回类型,也可能出现此错误。 此错误的常见原因是缺少接口标头。 通常可以根据此错误之后的注释中所述的类型名称来判断缺少的类型。 若要解决此问题,对于所使用的每一种类型,请包含该类型所在的命名空间的标头。

示例

以下 C++/WinRT 示例生成 C3779:

// C3779.cpp
#include <winrt/Windows.Gaming.Input.h>

void CheckGamepads()
{
    auto gamepads =
        winrt::Windows::Gaming::Input::Gamepad::Gamepads();
    for (auto&& gamepad : gamepads)
    {
        check(gamepad);
    }
}

此代码报告错误:

C3779.cpp(8): error C3779: winrt::impl::consume_Windows_Foundation_Collections_IIterable<D,winrt::Windows::Gaming::Input::Gamepad>::First': a function that returns 'auto' cannot be used before it is defined
with
[
    D=winrt:::Windows:::Gaming:::Input:::Gamepad
]
note: see declaration of 'winrt::impl::consume_Windows_Foundation_Collections_IIterable<D,winrt::Windows::Gaming::Input::Gamepad>::First'
with
[
    D=winrt::Windows::Gaming::Input::IVisualCollection
]

注释表示返回类型定义取决于 Windows::Foundation::Collections::IIterable。 若要解决此问题,请包含其包含命名空间的标头:

// C3779b.cpp
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Gaming.Input.h>

void CheckGamepads()
{
    auto gamepads =
        winrt::Windows::Gaming::Input::Gamepad::Gamepads();
    for (auto&& gamepad : gamepads)
    {
        check(gamepad);
    }
}

另请参阅

通过 C++/WinRT 使用 API
为什么我的 C++/WinRT 项目出现错误“consume_Something:若要使用返回‘auto’的函数,必须先定义此函数”?