1

イテレータと逆イテレータに関する最後の質問を踏まえて、カスタム クラスの実装が機能するようになりました...同じコンテナを反復処理する をconst_iterator作成したいと思います。const_reverse_iterator

私のいいねを実装しましconst_iterator

class const_iterator : public std::iterator<T, std::bidirectional_iterator_tag>
{
    ...
    // operator overloads *, ++, --, ==, !=, e.g.
    uint32_t operator*() const;
    ...
};

そして私は持っていtypedefます:

typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

さて、私crbegin()crend()実装は次のようになります (少し間違っていると思います):

const_reverse_iterator crbegin() const
{
    return const_reverse_iterator(this->cend());
}

const_reverse_iterator crend() const
{
    return const_reverse_iterator(this->cbegin());
}

問題: 私のテストでは、以下は正常に動作します:

for(const_iterator i = line.cbegin(); i != line.cend(); ++i)
{
    std::cout << static_cast<char>(*i); // Display as a 'char' for testing purposes
}

ただし、次のコードを使用します。

for(const_reverse_iterator i = line.crbegin(); i != line.crend(); ++i)
{
    std::cout << static_cast<char>(*i); // Why won't you display as a 'char' from 'unint32_t' like 'const_iterator' does??
}

std::cout行に次のエラーが表示されます。

error: invalid static_cast from type 'std::bidirectional_iterator_tag' to type 'char'|

これは手間のかからない を作成する有効な方法reverse_iteratorsですか?

欠けている単純なものがあるように感じますが、広範囲に検索しましたが、std::reverse_iterator<ITERATOR_TYPE>テンプレート化されたクラスでコンストラクターを呼び出す方法を示す例を見つけることができませんでした。

あなたの親切な言葉とアドバイスに感謝します。

編集:

参考までに、以下の解決策を変更する必要がありました。

class const_iterator : public std::iterator<T, std::bidirectional_iterator_tag>

class const_iterator : public std::iterator<std::bidirectional_iterator_tag, const T>

それが機能するために。私が扱ってconstいる s があるため、 にも注意してください。const_iterator

ありがとう!!

4

1 に答える 1

2

iterator値の型と反復子のカテゴリを逆にして、誤って特化しました。そのはず:

class const_iterator : public std::iterator<std::bidirectional_iterator_tag, T>
                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

その結果、const_iterator直接使用する場合は問題なく動作しますが、その特性に依存するもの、たとえば<algorithm>、 またはを使用するものはすべてstd::reverse_iterator失敗します。

于 2013-02-27T17:13:56.037 に答える