データを範囲に格納するコンテナーを作成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;
}
OK、イテレータはラップされたコンテナのイテレータから型定義されています。
range_type
ラップされたコンテナに格納されるタイプです。parent
親の範囲で、反復子としても格納されます。
問題は、 または のいずれかが割り当てられている行にあり_i->parent
ます。で返ってきます。さて、私にとって、これは日本語ですが、ポイントされた 2 つの行のそれぞれの左オペランドは;型であると書かれています。したがって、何も割り当てることはできません。 _end
_start
error c2678
const std::_Tree_const_iterator<_Mytree>
左オペランドが a であると見なされる理由const
const_iterator
はわかりませんが、それはエラーです。(ちなみに、parent は range_type で iterator として宣言されています。) 本当に面白いのは、別のメソッド (今回は同じクラスのパブリック メソッド) で、まったく同じことを iterator からの parent で行うことです。正常にコンパイルされます。このパブリック メソッドは、コード内で上記のプライベート メソッドの前にあります。パブリックメソッドは次のとおりです。
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> ]
これはとても不可解です。私はそれについて表も裏も作ることができず、なぜ同じことが他の機能で起こらなかったのか理解できません。イテレータを含むペアを返すためですか、それとも何かですか? 奇妙な複雑なもの?