试着写一个std :: iterator:编译错误

时间:2010-03-31 09:14:54

标签: c++ stl compiler-errors

我正在尝试为std::iterator MFC类编写CArray<Type,ArgType>。这就是我到目前为止所做的事情:

template <class Type, class ArgType>
class CArrayIterator : public std::iterator<std::random_access_iterator_tag, ArgType>
{
public:
    CArrayIterator(CArray<Type,ArgType>& array_in, int index_in = 0)
        : m_pArray(&array_in), m_index(index_in)
    {
    }

    void operator++() { ++m_index; }
    void operator++(int) { ++m_index; }
    void operator--() { --m_index; }
    void operator--(int) { --m_index; }
    void operator+=(int n) { m_index += n; }
    void operator-=(int n) { m_index -= n; }
    typename ArgType operator*() const{ return m_pArray->GetAt(m_index); }
    typename ArgType operator->() const { return m_pArray->GetAt(m_index); }
    bool operator==(const CArrayIterator& other) const
    {
        return m_pArray == other.m_pArray && m_index == other.m_index;
    }
    bool operator!=(const CArrayIterator& other) const
    {
        return ! (operator==(other));
    }

private:
    CArray<Type,ArgType>* m_pArray;
    int m_index;
};

我还提供了两个辅助函数来创建像这样的迭代器:

template<class Type, class ArgType>
CArrayIterator<Type,ArgType> make_begin(CArray<Type,ArgType>& array_in)
{
    return CArrayIterator<Type,ArgType>(array_in, 0);
}

template<class Type, class ArgType>
CArrayIterator<Type,ArgType> make_end(CArray<Type,ArgType>& array_in)
{
    return CArrayIterator<Type,ArgType>(array_in, array_in.GetSize());
}

为了测试代码,我编写了一个简单的class A并试图像这样使用它:

class A
{
public:
    A(int n): m_i(n)
    {
    }

    int get() const
    {
        return m_i;
    }

private:
    int m_i;
};
struct Test
{
    void operator()(A* p)
    {
        std::cout<<p->get()<<"\n";
    }
};

int main(int argc, char **argv) 
{
    CArray<A*, A*> b;

    b.Add(new A(10));
    b.Add(new A(20));

    std::for_each(make_begin(b), make_end(b), Test());
        return 0;
}

但是当我编译这段代码时,我收到以下错误:

  

错误4错误C2784:'布尔   std :: operator&lt;(const   的std :: _树&LT; _Traits&GT; &安培;,const的   的std :: _树&LT; _Traits&GT; &amp;)':不能   推导'const。的模板参数   的std :: _树&LT; _Traits&GT; &安培;”从   'CArrayIterator'C:\ Program   Files \ Microsoft Visual Studio   9.0 \ VC \ include \ xutility 1564 Vs8Console

任何人都可以了解我做错了什么以及如何纠正错误?如果重要的话,我正在使用VC9编译器。

2 个答案:

答案 0 :(得分:4)

你已经说过你的迭代器是一个“随机访问迭代器”。随机访问迭代器的部分要求是您提供<<=>>=比较运算符,<给出严格的弱排序和他们之间的通常关系。

您需要提供适当的比较运算符,或者您可以考虑“降级”为双向迭代器。

答案 1 :(得分:3)

根据您要执行的操作,您可能根本不需要编写迭代器类。 CArrayvector类似,因为底层数据存储只是一个C风格的数组,而类管理分配&amp;为你解除分配。您可以使用GetData()获取指向数据本身的指针,并使用简单的指针数学来查找结尾;与使用STL <algorithm>的原始C风格数组的方式大致相同。即:

#define _AFXDLL
#include <afx.h>
#include <afxwin.h>         // MFC core and standard components
#include <afxtempl.h>

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

int main()
{
    CArray<int, int> ints;
    srand((unsigned)time(0));
    for( int i = 0; i < 10; ++i )
        ints.Add(rand()%10);

    vector<int> ints2;
    copy(ints.GetData(), ints.GetData()+ints.GetCount(), back_inserter(ints2));

    cout << "Original : ";
    copy(ints.GetData(), ints.GetData()+ints.GetCount(), ostream_iterator<int>(cout, " "));
    cout << endl
        << endl
        << "Copy : ";

    copy(ints2.begin(), ints2.end(), ostream_iterator<int>(cout, " "));
    cout << endl;

    return 0;

}