2016-07-25 1 views
2

私の目的は、最初からカスタムイテレータを書く方法を学ぶことです。std :: sortで動作するカスタムイテレータを実装する

  • エラーC2666「SpanIterator:次のエラーを与え、

    #include <iostream> 
    #include <array> 
    
    int main() 
    { 
        std::array<double, 3> values = { 1, 2, 1 }; 
    
        SpanIterator<double> begin{ values.data() }; 
        SpanIterator<double> end{ values.data() + values.size() }; 
    
        std::sort(begin, end); 
    
        return EXIT_SUCCESS; 
    } 
    

    それがコンパイルに失敗しかし:

    #include <iterator> 
    
    template<class D> 
    class SpanIterator final : public std::iterator<std::random_access_iterator_tag, D> 
    { 
    private: 
        D* _data; 
    
    public: 
        explicit SpanIterator(D* data) : 
         _data{ data } 
        { 
        } 
    
        SpanIterator(const SpanIterator& itertator) = default; 
    
        SpanIterator& operator=(const SpanIterator& iterator) = default; 
    
        SpanIterator& operator=(D* data) 
        { 
         _data = data; 
    
         return *this; 
        } 
    
        operator bool() const 
        { 
         return _data != nullptr; 
        } 
    
        bool operator==(const SpanIterator& itertator) const 
        { 
         return _data == itertator._data; 
        } 
    
        bool operator!=(const SpanIterator& itertator) const 
        { 
         return _data != itertator._data; 
        } 
    
        SpanIterator& operator+=(const std::ptrdiff_t& movement) 
        { 
         _data += movement; 
    
         return *this; 
        } 
    
        SpanIterator& operator-=(const std::ptrdiff_t& movement) 
        { 
         _data -= movement; 
    
         return *this; 
        } 
    
        SpanIterator& operator++() 
        { 
         ++_data; 
    
         return *this; 
        } 
    
        SpanIterator& operator--() 
        { 
         --_data; 
    
         return *this; 
        } 
    
        SpanIterator operator++(int) 
        { 
         auto temp = *this; 
    
         ++_data; 
    
         return temp; 
        } 
    
        SpanIterator operator--(int) 
        { 
         auto temp = *this; 
    
         --_data; 
    
         return temp; 
        } 
    
        SpanIterator operator+(const std::ptrdiff_t& movement) 
        { 
         auto oldPtr = _data; 
    
         _data += movement; 
    
         auto temp = *this; 
    
         _data = oldPtr; 
    
         return temp; 
        } 
    
        SpanIterator operator-(const std::ptrdiff_t& movement) 
        { 
         auto oldPtr = _data; 
    
         _data -= movement; 
    
         auto temp = *this; 
    
         _data = oldPtr; 
    
         return temp; 
        } 
    
        D& operator*() 
        { 
         return *_data; 
        } 
    
        const D& operator*() const 
        { 
         return *_data; 
        } 
    
        D& operator->() 
        { 
         return _data; 
        } 
    }; 
    

    私はそうのようにテストしてい:私は、次のイテレータを書かれています: :演算子 - ':2オーバーロード

  • エラーC2780' void std :: _ Sort_unchecked1(_RanIt、_RanIt、_Diff、_Pr &) ':

    • '空のstdは:: _ Guess_median_unchecked(_RanIt、_RanIt、_RanIt、_Pr &)': はテンプレートを導き出すことができなかった3私はSpanIterator operator-(const std::ptrdiff_t& movement)を削除した場合、私は別のエラーが出

    を提供 - 4つの引数を期待「int型

  • '_Guess_median_unchecked' から '_RanIt' の引数は:一致オーバーロードされた関数は、違法な間接
  • エラーC2100を認めなかった

答えて

4

あなたはfollowing operationsabがあなたのイテレータ型SpanIterator<...>の値である)をサポートするための演算子を逃している:std::sortドン」のほとんどの実装が、

  • b - a
  • a < b(および残りの比較をそれらを使用する)。たとえば、

、あなたは以下のメンバ演算子のオーバーロードを提供することができます:

std::ptrdiff_t operator-(SpanIterator const&) const; 
bool operator<(SpanIterator const&) const; 
// etc. 

(非会員の過負荷がしばしば好まれることに注意してください:Operator overloading

を加えて、あなたのoperator boolexplicitする必要がありますa + n,n + aおよびb - a操作のあいまいなオーバーロードを避けるためです(nは、差異タイプの値、つまりstd::ptrdiff_tです)。

+0

「演算子bool」に明示的に追加し、あなたが言及した2つの演算子を追加すると、トリックが完了しました.-ありがとう – keith

関連する問題