Форум программистов, компьютерный форум CyberForum.ru

Почему не компилируются вызовы алгоритмов при использовании собственного итератора? - C++

Восстановить пароль Регистрация
 
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.10.2010, 14:45     Почему не компилируются вызовы алгоритмов при использовании собственного итератора? #1
Есть класс итератор. Автономно, со своим вектором он работает прекрасно. В алгоритмах в чем-то проблема. Подскажите плиз в чем? Швыряет такую ошибку:

Код
Error	1	error C2665: 'std::_Debug_range2' : none of the 2 overloads could convert all the argument types	c:\program files\microsoft visual studio 8\vc\include\xutility	1406
В функции:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
template<class _InIt> inline
    void __CLRCALL_OR_CDECL _Debug_range(_InIt _First, _InIt _Last, const wchar_t *_File, unsigned int _Line)
    {   // test iterator pair for valid range
    _Debug_range2(_First, _Last, _File, _Line, _Iter_cat(_First));
    }
 
template<class _InIt> inline
    void __CLRCALL_OR_CDECL _Debug_range2(_InIt, _InIt, const wchar_t *, unsigned int ,
        input_iterator_tag)
    {   // test iterator pair for valid range, arbitrary iterators
    }
 
template<class _RanIt> inline
    void __CLRCALL_OR_CDECL _Debug_range2(_RanIt _First, _RanIt _Last, const wchar_t *_File, unsigned int _Line,
        random_access_iterator_tag)
    {   // test iterator pair for valid range, random-access iterators
    if (_First != _Last)
        {   // check for non-null pointers, valid range
        _DEBUG_POINTER2(_First, _File, _Line);
        _DEBUG_POINTER2(_Last, _File, _Line);
        if (_Last < _First)
            _DEBUG_ERROR2("invalid iterator range", _File, _Line);
        }
    }
В чем может быть проблема? Хотя бы примерно... Ведь мой итератор должен по идее работать с алгоритмами.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
struct random_access_iterator_tag
{
};
 
template<class IterType, class AllocType>
class Iterator
{
public:
    typedef IterType value_type;
    typedef typename AllocType::difference_type difference_type;
    typedef typename AllocType::reference reference;
    typedef typename AllocType::pointer pointer;
    typedef size_t size_type;
    typedef random_access_iterator_tag iterator_category;
    
    Iterator()
    {
        Iter=0;
    }
    Iterator(pointer Other)
    {
        Iter=Other;
    }
    Iterator(Iterator& Other)
    {
        Iter=Other.Iter;
    }
    ~Iterator()
    {
    }
    Iterator& operator =(const Iterator& Other)
    {
        Iter=Other.Iter;
        return *this;
    }
    pointer operator ->() const
    {
        return &*Iter;
    }
    reference operator *() const
    {
        return *Iter;
    }
    Iterator& operator ++()
    {
        ++Iter;
        return *this;
    }
    Iterator operator ++(int i)
    {
        Iterator Temp(*this);
        ++(*this);
        return Temp;
    }
    Iterator& operator --()
    {
        --Iter;
        return *this;
    }
    Iterator operator --(int i)
    {
        Iterator Temp(*this);
        --(*this);
        return Temp;
    }
    Iterator& operator +=(const difference_type& idx)
    {
        Iter+=idx;
        return *this;
    }
    Iterator& operator -=(const difference_type& idx)
    {
        Iter-=idx;
        return *this;
    }
    Iterator operator +(const size_type& idx) const
    {
        return Iter+idx;
    }
    Iterator operator -(const size_type& idx) const
    {
        return Iter-idx;
    }
    reference operator [](const size_type& idx) const
    {
        return *(Iter+idx);
    }
    bool operator <(const Iterator& Other) const
    {
        return Iter<Other.Iter;
    }
    bool operator >(const Iterator& Other) const
    {
        return (!(*this<Other));
    }
    bool operator ==(const Iterator& Other) const
    {
        return Iter==Other.Iter;
    }
    bool operator !=(const Iterator& Other) const
    {
        return (!(*this==Other));
    }
    bool operator <=(const Iterator& Other) const
    {
        return Iter<=Other.Iter;
    }
    bool operator >=(const Iterator& Other) const
    {
        return (!(*this<=Other));
    }
    difference_type operator -(const Iterator& Other) const
    {
        return Iter-Other.Iter;
    }
private:
    pointer Iter;
};
В векторе:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef Iterator<Type, AllocType> iterator;
    inline iterator begin() const
    {
        return iterator(Arr);
    }
    inline iterator end() const
    {
        return iterator(Arr+Size);
    }
    inline iterator rbegin() const
    {
        return iterator(Arr+Size);
    }
    inline iterator rend() const
    {
        return iterator(Arr);
    }
Добавлено через 11 часов 20 минут
Долбанные зависимости. Решилось все невообразимо просто.
И все стало работать.
C++
1
2
3
struct random_access_iterator_tag:public std::bidirectional_iterator_tag
{
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2010, 14:45     Почему не компилируются вызовы алгоритмов при использовании собственного итератора?
Посмотрите здесь:

C++ Почему при использовании do while программа некомпелируеца?
C++ Почему портится поток cin при использовании функции getline
C++ Ошибка при использовании итератора в реализации класса
C++ итератора для собственного вектора
C++ Запись в собственного класса бинарный файл собственного
Размер контейнера не меняется при изменении итератора C++
C++ Степенной метод нахождения наибольшего по модулю собственного значения и соответствующего ему собственного вектора
Подскажите, почему не видит переменные a и b? При использовании конструктора C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 14:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru