вписаться в концепт ranges
От: sergii.p  
Дата: 03.08.22 13:27
Оценка:
что-то тону в простынях ошибок. Решил переложить проблему
Задача: нужно создать коллекцию, которая бы могла работать с рэнжами (н-р можно было применить 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, но всё равно не пойму что не так
Re: вписаться в концепт ranges
От: σ  
Дата: 03.08.22 13:52
Оценка: 3 (1)
bool operator == (const Iterator& other) const
bool operator != (const Iterator& other) const
Отредактировано 03.08.2022 13:55 σ . Предыдущая версия .
Re: вписаться в концепт ranges
От: Андрей Тарасевич Беларусь  
Дата: 03.08.22 20:33
Оценка: 2 (1) +1
Здравствуйте, sergii.p, Вы писали:

SP>Наиболее адекватная ошибка от clang, но всё равно не пойму что не так


Взять в привычку реализовывать симметричные (по отношению к типизации аргументов) операторы обычными функциями, а не методами классов. Не

bool operator == (const Iterator& other)


а

friend bool operator ==(const Iterator &lhs, const Iterator &rhs)


Тогда и ошибки подобного рода будут бросаться в глаза (или вообще перестанут возникать).
Best regards,
Андрей Тарасевич
Отредактировано 03.08.2022 20:35 Андрей Тарасевич . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.