C++ C++;11:为什么在同一个类中,这在一种方法中有效,而在另一种方法中无效?迭代器变形为常量迭代器?

C++ C++;11:为什么在同一个类中,这在一种方法中有效,而在另一种方法中无效?迭代器变形为常量迭代器?,c++,c++11,iterator,transformation,const-iterator,C++,C++11,Iterator,Transformation,Const Iterator,我正在编写一个range\u map容器,它将数据存储在范围中,允许您选择一个点并获取覆盖它的范围。通常,当插入一个范围时,它的起点和终点都必须被相同的范围覆盖——这会导致范围的金字塔形堆积 作为其他范围子集的范围将这些其他范围作为父范围。当我遇到这个奇怪的问题时,我正在调试它。以下是发生错误的容器中的一个私有方法--它是一个helper方法: std::pair\u insert2(范围类型&&u s,范围类型&&u e){ std::pair _ret(end(),false); std::

我正在编写一个
range\u map
容器,它将数据存储在范围中,允许您选择一个点并获取覆盖它的范围。通常,当插入一个范围时,它的起点和终点都必须被相同的范围覆盖——这会导致范围的金字塔形堆积

作为其他范围子集的范围将这些其他范围作为父范围。当我遇到这个奇怪的问题时,我正在调试它。以下是发生错误的容器中的一个私有方法--它是一个helper方法:

std::pair\u insert2(范围类型&&u s,范围类型&&u e){
std::pair _ret(end(),false);
std::pair _temp=_myset.insert(std::forward(_s));
如果(!\u temp.second)返回返回;
迭代器_start=_temp.first;
_temp=_myset.insert(std::forward(_e));
如果(!\u temp.second){erase(\u start);返回{u ret;}
迭代器_end=_temp.first;
迭代器i=\u开始;
对于(+++u i;_i!=\u end;++u i){
如果(\u i->is\u end)
_i->parent=\u end;
其他的
_i->parent=\u start;
}
_ret.first=\u start;
_ret.second=真;
返回(ret);;
}
好的,迭代器是从包装容器的迭代器中定义的类型

  • range\u type
    是存储在包装容器中的类型
  • parent
    是父范围,它也存储为迭代器
问题出现在为
\u i->parent
分配
\u end
\u start
的行中。它返回时出现
错误c2678
。现在,对我来说,这是日文的,但是它说,指向的两行中的每一行的左操作数都是
const std::_Tree\u const_iterator
;因此,它不能被分配任何内容

我不知道为什么它认为左操作数是常量迭代器,但这就是错误所在。(顺便说一句,parent在range_type中被声明为迭代器。)真正有趣的是,在另一个方法(这次是同一类中的公共方法)中,我从迭代器对parent做了完全相同的事情,它似乎编译得很好——在代码中,这个公共方法在上面的私有方法之前。以下是公共方法:

迭代器擦除(常量迭代器){
迭代器_mine=_myset.下限(*\u iter);
迭代器\u start=\u mine->is\u end?find\u对立\u pt(\u mine):\u mine;
迭代器\u end=\u mine->is\u end?\u mine:查找相反的\u pt(\u mine);
迭代器\u ps=\u开始->父级,\u pe=\u结束->父级;
迭代器i=\u开始;
对于(+++u i;_i!=\u end;++u i)
_i->parent=\u i->is\u end?\u pe:\u ps;
_myset.erase(_start);
返回_myset.erase(_end);
}
虽然代码中的此方法出现在给出错误的方法之前,但对
\u i->parent
赋值的行没有给出错误

这是怎么回事?为什么迭代器似乎会变形为常量迭代器?我希望我已经足够详细了

编辑:以下是输出的其余部分,已翻译:

   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>          ]
与
1>          [
1> _Mytree=std::_Tree\u val
1>          ]
1> c:\ProgramFiles\microsoft visual studio 10.0\vc\include\xtree(337):可能是这样的:“std::\u Tree\u const\u iterator&std::\u Tree\u const\u iterator::operator=(const std::\u Tree\u const\u iterator&)”。
1> 与
1>          [
1> _Mytree=std::_Tree\u val
1>          ]
如果组合参数列表“(常数std::_Tree\u const\u iterator,std:_Tree\u const\u iterator)”
具有
1>          [
1> _Mytree=std::_Tree\u val
1>          ]
c:\users\one\documents\visualstudio 2010\projects\range\u map\u test\range\u map.h(487):编译类模板成员方法“std::pair range\u map::_insert2(range\u map::range\u type&,range\u map::range\u type&)”
具有
1>          [
1> _Ty1=std::_Tree_const_迭代器,
1> _Ty2=bool,
1> _Kty=int,
1> _Ty=int
1>          ]
1> c:\users\one\documents\visual studio 2010\projects\range\u map\u test\range\u map\u test\main.cpp(6):请检查模板“range\u map”实例的声明
1> 与
1>          [
1> _Kty=int,
1> _Ty=int
1>          ]

这太神秘了。我无法理解它的头绪,也无法理解为什么在另一个函数中没有发生同样的情况。这是因为它返回一个包含迭代器的对,还是什么?一些奇怪而复杂的事情?

我最初的想法是,当你调用
insert2
时,
\u s
是常量。看看生成输出错误消息,该消息是否比您在此处发布的消息长?可能还有更多的线索。不幸的是,这些错误信息可能是神秘的,需要一些解密。事实并非如此_s和_e由调用函数创建并传递给_insert2。我将在问题中发布其余的错误输出。好的,我实际上尝试使用我在上面发布的擦除功能,当我这样做时,同样的错误也发生在那里,因此它更有意义。只是,这是怎么回事?父级在类范围_type(在容器中声明和定义)中定义为私有成员“迭代器父级;”;容器类是一个friend类,例如:“friend class range_map;”;它基本上使用容器类的参数作为模板参数。将迭代器作为私有成员有什么错?指针更好?我将创建一个测试类,通过一些修改重新创建条件,并对其进行修补,以试图准确地了解幕后发生了什么。