模板类中的不等式检查

Inequality check within template class

本文关键字:不等式 检查      更新时间:2023-10-16

我正在努力使迭代器正常工作,并针对不等式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;
    }
}

这是根本错误的:

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>&,因为这是它为!=找到的匹配项。只需修复!=以迭代器作为第二个参数,就可以了。