Ошибка компилятора 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);
}
}
См. также
Использование интерфейсов API с помощью C++/WinRT
Почему проект C++/WinRT получает ошибки формы "consume_Something: функция, возвращающая "авто", не может использоваться до его определения"?