auto как тип, который возвращает функция C++

как заставить это работать?

LazyRepeater.h

#include <string>
auto makeLooper(const std::string& str);
class LazyRepeater {
    std::string str;
    int pos{ 0 };
public:
    LazyRepeater(std::string str);
    char operator() ();
};

LazyRepeater.cpp

#include "LazyRepeater.h"
#include <string>
auto makeLooper(const std::string& str){
    return LazyRepeater(str);
}
LazyRepeater::LazyRepeater(std::string str){
    this->str = str;
}
char LazyRepeater::operator() () {
    char ch = this->str[this->pos];
    this->pos++;
    this->pos %= this->str.length();
    return ch;
}

ошибка: "makeLooper": функцию, возвращающую "auto" нельзя использовать, предварительно не определив


Ответы (1 шт):

Автор решения: HolyBlackCat

Все логично. Определение функции, возвращающей auto, должно быть видно в той единице трансляции (.cpp-файл вместе со всеми заинклуженными хедерами), в которой ее вызывают. Потому что все типы должны быть известны во время компиляции, а вместо auto нельзя подставить правильный тип, не видя определения.

Поэтому auto в возвращаемом типе имеет смысл использовать только для функций, которые уже определены в хедере по какой-то причине (потому что они шаблоны, или inline) (или не в хедере а просто в том же .cpp-файле). Переносить функцию в хедер только для того, чтобы auto заработал - странно.

Поэтому в вашем случае проще явно указать возвращаемый тип. (Или подвинуть функцию в хедер, сделав inline.)

→ Ссылка