Я согласен с @ vlad-from-moscow, вероятно, это ошибка MSV C, потому что по умолчанию Visual Studio 2019 настроен на C ++ 14. Он не должен компилироваться.
Ваш код правильный, начиная с c ++ 17. Если вы используете C ++ 17, ваш код будет компилироваться на G CC и CLang.
Реализация на основе диапазона для l oop изменилась.
C ++ 11:
{
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr;
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
C ++ 17:
{
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
Ваш начальный итератор имеет тип FiboIterator, ваш конечный итератор имеет тип int.
// c++11 version fails, auto can't deduce type
auto __begin = begin_expr, __end = end_expr; // an error here
// C++17 version works fine, they are different types.
auto __begin = begin_expr ;
auto __end = end_expr;
Если да не хотите использовать C ++ 17, тогда вам следует сделать одинаковые типы возвращаемых значений begin и end и оператор сравнения для FiboIterator.
#include <cstdio>
class FiboIterator {
int current{ 1 };
int last{ 1 };
public:
FiboIterator(int x=1) : current{x} {}
bool operator!=(FiboIterator x) const {
return x.current >= current;
}
FiboIterator& operator++() {
const auto tmp = current;
current += last;
last = tmp;
return *this;
}
int operator*() {
return current;
}
};
class FiboRange {
const int max;
public:
explicit FiboRange(int max): max{max} {}
FiboIterator begin() const {
return FiboIterator{};
}
FiboIterator end() const {
return FiboIterator{max};
}
};