次の方法で共有


コンパイラ エラー C3779

'function': 'auto または decltype(auto)' を返す関数を、定義より前に使用することはできません

指定 した関数呼び出しの戻り値の型 auto を推測できませんでした。 コンパイラの呼び出しサイトに十分な情報がありませんでした。

解説

このエラーは、戻り値の型 auto を持つ一方で、本文または後続の戻り値の型がない前方宣言メンバー関数を呼び出したときに発生する可能性があります。 また、テンプレートの特殊化をインスタンス化する際に、コンパイラによって候補の戻り値の型が見つからなかった場合にも、このエラーが発生する可能性があります。 このエラーの一般的な原因は、インターフェイス ヘッダーの欠落にあります。 多くの場合、不足している型は、このエラーの後のノートに記載されている typename から判断できます。 この問題を解決するには、使用する型ごとに、その型がある名前空間のヘッダーを含めます。

次の 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' を返す関数を定義する前に使用できない" という形式のエラーが発生する理由