2

我正在尝试使用 boost 迭代器适配器为 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) : erro r C2039: 'difference_type' : is not a member of 'boost::detail::iterator_traits< Iterator>' with [ Iterator=int ]

\include\boost\mpl\eval_if.hpp(41) :参见使用 [ Iterator=int ] 编译的类模板实例化 'boost::iterator_difference' 的参考

.... 多一点 ....

有什么线索可能是错的吗?我必须包含其他一些头文件?我对提升图书馆很陌生。

4

2 回答 2

4

我认为 boost::iterator_adaptor<> 的第二个模板参数必须是有效的迭代器类型,尝试使用 int* 而不是 int。

于 2010-02-01T12:13:55.610 回答
0

它可能与随机访问行为没有遍历容器所需的一切有关。此链接的“迭代器适配器要求”部分可能会有所帮助:

Boost:迭代器适配器

我不确定 int 是否可赋值,所以我想知道如果将 int 更改为 int& 会发生什么。

还有一些想法:

  • 您是否在两个编译器中使用相同版本的 Boost 库?
  • 使 dereference() 受保护还是公共帮助?
于 2010-02-01T10:32:05.073 回答