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型
- '空のstdは:: _ Guess_median_unchecked(_RanIt、_RanIt、_RanIt、_Pr &)': はテンプレートを導き出すことができなかった3私は
- '_Guess_median_unchecked' から '_RanIt' の引数は:一致オーバーロードされた関数は、違法な間接
- エラーC2100を認めなかった
「演算子bool」に明示的に追加し、あなたが言及した2つの演算子を追加すると、トリックが完了しました.-ありがとう – keith