다음을 통해 공유


컴파일러 오류 C3779

'function': 'auto 또는 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'를 반환하는 함수를 정의하기 전에 사용할 수 없음" 형식의 오류가 발생하는 이유는 무엇인가요?