2

データを範囲に格納するコンテナーを作成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_starterror c2678const 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>          ]

これはとても不可解です。私はそれについて表も裏も作ることができず、なぜ同じことが他の機能で起こらなかったのか理解できません。イテレータを含むペアを返すためですか、それとも何かですか? 奇妙な複雑なもの?

4

0 に答える 0