2

ブースト反復子アダプターを使用して、CArray MFC クラスの単純な STL 反復子を作成しようとしています。これは私のコードです:

#include <boost/iterator/iterator_adaptor.hpp>
#include <afxtempl.h>

class CArrIter : public boost::iterator_adaptor< CArrIter , 
    int, 
    int,
    boost::random_access_traversal_tag >
{
public:
    CArrIter(CArray<int,int>& arr, int index = 0) : m_arr(arr)
    {
        this->base_reference() = index;
    }

private:
    friend class boost::iterator_core_access;
    int dereference() const{
        return m_arr.GetAt(base());
    }


private:
    CArray<int,int>& m_arr;
};

これは、VC9 コンパイラで正常にコンパイルされます。しかし、これを VC7 でコンパイルしようとすると、次のエラーが発生します。

\include\boost\iterator\iterator_traits.hpp(49): エラー C2039: 'difference_type' : [ Iterator=int ] の 'boost::detail::iterator_traits< Iterator>' のメンバーではありません

\include\boost\mpl\eval_if.hpp(41) : [ Iterator=int ] でコンパイルされたクラス テンプレートのインスタンス化 'boost::iterator_difference' への参照を参照してください

....もう少し....

何が間違っている可能性がありますか?他のヘッダー ファイルをインクルードする必要がありますか? 私はライブラリをブーストするのはかなり新しいです。

4

2 に答える 2

4

boost :: iterator_adaptor<>の2番目のテンプレートパラメータは有効なイテレータタイプである必要があると思います。intの代わりにint*を使用してみてください。

于 2010-02-01T12:13:55.610 に答える
0

これは、コンテナーをトラバースするために必要なものがすべて揃っていないランダム アクセス動作に関連している可能性があります。このリンクの「iterator_adaptor 要件」セクションが役立つ場合があります。

ブースト: イテレータ アダプタ

int が代入可能かどうかわからないので、int を int& に変更したらどうなるのだろうと思います。

さらにいくつかのアイデア:

  • 両方のコンパイラで同じバージョンの Boost ライブラリを使用していますか?
  • dereference() を保護または公開することは役に立ちますか?
于 2010-02-01T10:32:05.073 に答える