@PDCherkasova

Как исправить ошибку при рекурсивном вызове корутины?

Пытаюсь вызвать корутину async_rec_dir_iter рекурсивно, получаю ошибку
member reference base type 'void' is not a structure or union. Подскажите, пожалуйста, как это исправить?
void async_rec_dir_iter(const async_dir_iter& dir,  std::atomic_size_t &total)
{
    struct Awaiter
    {
        const async_dir_iter dir;
         std::atomic_size_t& total;

        bool await_ready() { return false; }

        void await_suspend(std::experimental::coroutine_handle<> coro)
        {
            for(;;)
            {
                const auto child_dir = co_await async_read_next(dir);
                if (child_dir.get_type()==-2)
                    break;
                else
                {
                    if (child_dir. get_type() == 0)
                        total+=child_dir.get_size();
                    else
                    {
                        if (child_dir.get_path().filename()!="."&&child_dir.get_path().filename()!="..")
                        {
                            co_await async_rec_dir_iter(child_dir, total); //Ошибка в этой строчке
                        }
                    }
                }
            }
            coro.resume();
        }

        void await_resume() {}
    };
    auto res = Awaiter{dir, total};
}
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ответы на вопрос 1
xorknown
@xorknown
Ошибка говорит о том, что async_rec_dir_iter - не корутина. co_await - это оператор работающий с возвращаемым значением функции, т.е. вы вызываете функцию, она возвращает какой-то awaiter и уже тогда co_await вызывает функции у него чтобы определить продолжить корутину или нет. Т.е. вам надо как минимум вернуть ваш класс из функции.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы