что-то тону в простынях ошибок. Решил переложить проблему
Задача: нужно создать коллекцию, которая бы могла работать с рэнжами (н-р можно было применить std::views::filter).
Минимальный пример, который смог набросать:
| Код |
| #include <iostream>
#include <ranges>
struct MyRange
{
using value_type = int;
struct Iterator
{
using iterator_category = std::input_iterator_tag;
using value_type = typename MyRange::value_type;
using difference_type = std::ptrdiff_t;
using pointer = value_type*;
using reference = value_type&;
Iterator& operator++()
{
return *this;
}
Iterator operator++(int)
{
return Iterator{};
}
bool operator == (const Iterator& other)
{
return true;
}
bool operator != (const Iterator& other)
{
return !(*this == other);
}
int operator*()
{
return 0;
}
};
Iterator begin() const
{
return Iterator{};
}
Iterator end() const
{
return Iterator{};
}
};
int main()
{
static_assert(std::ranges::range<MyRange>);
return 0;
}
|
| |
https://godbolt.org/z/KnWTa3EdW
Наиболее адекватная ошибка от clang, но всё равно не пойму что не так
bool operator == (const Iterator& other) const
bool operator != (const Iterator& other) const
Здравствуйте, sergii.p, Вы писали:
SP>Наиболее адекватная ошибка от clang, но всё равно не пойму что не так
Взять в привычку реализовывать симметричные (по отношению к типизации аргументов) операторы обычными функциями, а не методами классов. Не
bool operator == (const Iterator& other)
а
friend bool operator ==(const Iterator &lhs, const Iterator &rhs)
Тогда и ошибки подобного рода будут бросаться в глаза (или вообще перестанут возникать).