2016-03-27 4 views
-1

Я пытаюсь сделать итератор работоспособным и для неравенства 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; 
    } 
} 
+0

Подумайте немного больше о выражении 'i! = A.end()', он не сравнивает итератор с вектором, он сравнивает итератор с другим итератором. И ваша 'operator! =' Функция тоже не имеет смысла, она сравнивает целое число с указателем на функцию-член. –

ответ

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>&, так как это совпадение, которое он нашел для !=. Просто исправьте !=, чтобы взять итератор в качестве второго аргумента, и все будет в порядке.

Смежные вопросы