C ++ 11: Почему это работает в одном методе, а не в другом в том же классе? Итераторы превращаются в const const_iterators?

Я пишу range_map контейнер, который хранит данные в диапазонах, позволяя вам выбрать точку и получить диапазоны, которые ее покрывают. Как правило, когда диапазон вставляется, его начальная и конечная точки должны быть покрыты одинаковыми диапазонами, что вызывает своего рода пирамидальное наращивание диапазонов.

Диапазоны, которые являются подмножествами других диапазонов, имеют эти другие диапазоны как родительские. Я почти закончил с этим и отлаживаю, когда я прошел через эту странную проблему. Вот частный метод — это вспомогательный метод — из контейнера, где произошла ошибка:

std::pair<iterator, bool> _insert2(range_type&& _s, range_type&& _e) {
std::pair<iterator, bool> _ret(end(), false);

std::pair<iterator, bool> _temp = _myset.insert(std::forward<range_type>(_s));
if(!_temp.second) return _ret;
iterator _start = _temp.first;
_temp = _myset.insert(std::forward<range_type>(_e));
if(!_temp.second) {erase(_start); return _ret;}
iterator _end = _temp.first;

iterator _i = _start;
for(++_i; _i != _end; ++_i) {
if(_i->is_end)
_i->parent = _end;
else
_i->parent = _start;
}

_ret.first = _start;
_ret.second = true;

return _ret;
}

Хорошо, итератор typedef’d из итератора упакованного контейнера.

  • range_type это тип, который хранится в упакованном контейнере.
  • parent является родительским диапазоном, который также сохраняется как итератор.

Проблема в том, где _i->parent назначается либо _end или же _start, Возвращается error c2678, Теперь, для меня, это на японском языке, но он говорит, что левый операнд для каждой из двух указанных линий имеет тип const std::_Tree_const_iterator<_Mytree>; следовательно, ему ничего нельзя назначить.

Почему он считает левый операнд const const_iteratorЯ не знаю, но это ошибка. (Между прочим, parent объявлен как итератор в range_type.) Что действительно забавно, так это то, что в другом методе (на этот раз публичный метод в том же классе) я делаю то же самое с parent из итератора, и кажется, что нормально скомпилировать — этот открытый метод предшествует приведенному выше методу private в коде. Вот публичный метод:

iterator erase(const_iterator _iter) {
iterator _mine = _myset.lower_bound(*_iter);
iterator _start = _mine->is_end ? find_opposite_pt(_mine) : _mine;
iterator _end = _mine->is_end ? _mine : find_opposite_pt(_mine);

iterator _ps = _start->parent, _pe = _end->parent;
iterator _i = _start;
for(++_i; _i != _end; ++_i)
_i->parent = _i->is_end ? _pe : _ps;

_myset.erase(_start);
return _myset.erase(_end);
}

Хотя этот метод в коде предшествует тому, который дал ошибку, для строки, где _i->parent было присвоено значение.

Что здесь происходит? Почему итератор, кажется, превращается в const const_iterator? Я надеюсь, что я был достаточно подробным.

РЕДАКТИРОВАТЬ: Вот остальные выходные данные, переведенные:

   with
1>          [
1>              _Mytree=std::_Tree_val<std::_Tset_traits<range_map<int,int>::range_type,range_map<int,int>::value_compare,std::allocator<range_map<int,int>::range_type>,false>>
1>          ]
1>          c:\program files\microsoft visual studio 10.0\vc\include\xtree(337): It could be this: 'std::_Tree_const_iterator<_Mytree> &std::_Tree_const_iterator<_Mytree>::operator =(const std::_Tree_const_iterator<_Mytree> &)'.
1>          with
1>          [
1>              _Mytree=std::_Tree_val<std::_Tset_traits<range_map<int,int>::range_type,range_map<int,int>::value_compare,std::allocator<range_map<int,int>::range_type>,false>>
1>          ]
If you combine the parameter list '(const std::_Tree_const_iterator<_Mytree>, std::_Tree_const_iterator<_Mytree>)'
with
1>          [
1>              _Mytree=std::_Tree_val<std::_Tset_traits<range_map<int,int>::range_type,range_map<int,int>::value_compare,std::allocator<range_map<int,int>::range_type>,false>>
1>          ]
c:\users\one\documents\visual studio 2010\projects\range_map_test\range_map_test\range_map.h(487): While compiling class template member method 'std::pair<_Ty1,_Ty2> range_map<_Kty,_Ty>::_insert2(range_map<_Kty,_Ty>::range_type &&,range_map<_Kty,_Ty>::range_type &&)'
with
1>          [
1>              _Ty1=std::_Tree_const_iterator<std::_Tree_val<std::_Tset_traits<range_map<int,int>::range_type,range_map<int,int>::value_compare,std::allocator<range_map<int,int>::range_type>,false>>>,
1>              _Ty2=bool,
1>              _Kty=int,
1>              _Ty=int
1>          ]
1>          c:\users\one\documents\visual studio 2010\projects\range_map_test\range_map_test\main.cpp(6) : Please check the declaration of the instance of the template 'range_map<_Kty,_Ty>'
1>          with
1>          [
1>              _Kty=int,
1>              _Ty=int
1>          ]

Это так загадочно. Я не могу сделать из этого головы или хвосты, и я не могу понять, почему то же самое не произошло в этой другой функции. Это потому, что он возвращает пару с итератором или что-то еще? Какая-то странная сложная вещь?

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …