模板类中的不等式检查

时间:2016-03-27 18:28:15

标签: c++ class templates friend

我正在尝试使迭代器正常工作,以及不等式i != a.end()

我收到错误

no know conversion from argument 2 from 'const a3::vector<int>::iterator' to 'const a3::vector<int>&

为朋友功能。我需要函数来检查迭代器是否等于vector.end()并且我不确定如何执行它。

#include <iostream>
using std::cout;
using std::endl;

namespace a3
{
template <typename T>
class vector
{
  public:


  class iterator {
    public:
    int index_;
    vector* a_;

    iterator() : index_(-1), a_(0) {}
    iterator(int index, vector* a) : index_(index), a_(a) {}

    iterator& operator=(const iterator& itr)
    {
      a_ = itr.a_;
      index_ = itr.index_;
      return *this;
    }

    iterator& next() {
      index_++;
      return *this;
    }

    iterator& operator++() {
      return next();
    }




    int& operator*() { return (*a_)[index_]; }
  };

  private:
  T* mem_;
  int sz_;

  public:
  vector(int sz) : sz_(sz), b_(0, this), e_(sz, this)
  {
    mem_ = new T[sz];
  }
  ~vector() { delete[] mem_; }

  const T& operator[](T i) const { return mem_[i]; }
  T& operator[](T i) { return mem_[i]; }

  const int& get_size() const { return sz_; }

  const iterator& begin() { return b_; }
  const iterator& end() { return e_; }

  friend bool operator!=(const iterator& itr1, const vector<T>& vec1)
  {
    return !(itr1.index_ == vec1.end);
  }


  private:
  iterator b_;
  iterator e_;
};
}

主要功能

#include "a3_vector.cpp"


int main(int argc, char** argv)
{
    using namespace a3;
    vector<int> a(10); // allocate an int array of size 10
    for (int i=0; i<10; ++i) a[i] = i*2;

    // a now looks as follows
    //0,2,4,6,8,10,12,14,16,18

    // prints the content of the array
    vector<int>::iterator i;
    for (i = a.begin(); i != a.end(); i.next()) {
        cout << *i << endl;
    }
}

1 个答案:

答案 0 :(得分:1)

这是根本错误的:

friend bool operator!=(const iterator& itr1, const vector<T>& vec1)

迭代器比较应该比较迭代器。您想要的是比较运算符,如下所示:

friend bool operator!=(const iterator& itr1, const iterator& itr2);
friend bool operator==(const iterator& itr1, const iterator& itr2);

毕竟,这就是这个表达式试图做的事情:

i != a.end()

您正在尝试比较两个迭代器。该错误只是尝试将a.end()转换为const vector<T>&,因为这是它为!=找到的匹配项。只需修复!=以将迭代器作为第二个参数,你就可以了。