2016-03-27 9 views
-1

Ich versuche, den Iterator ordnungsgemäß funktionieren zu lassen, und für die Ungleichheit i != a.end().Ungleichheitsüberprüfung innerhalb der Vorlagenklasse

Ich erhalte den Fehler

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

für die Friend-Funktion. Ich brauche die Funktion, um zu überprüfen, ob der Iterator ist nicht gleich vector.end() und bin mir nicht sicher, wie ich es tun würde.

Klasse

#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_; 
}; 
} 

Hauptfunktion

#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

Denken Sie ein wenig mehr über den Ausdruck 'i! = A.end()', es vergleicht nicht einen Iterator mit einem Vektor, es vergleicht einen Iterator mit einem anderen Iterator. Und Ihre 'operator! =' Funktion macht auch keinen Sinn, sie vergleicht eine Ganzzahl mit einem Zeiger auf eine Elementfunktion. –

Antwort

1

Dies ist grundlegend falsch:

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

Iterator Vergleiche Iteratoren vergleichen sollte. Was Sie wollen, sind Vergleichsoperatoren, die wie folgt aussehen:

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

Immerhin, das ist, was dieser Ausdruck zu tun versucht:

i != a.end() 

Sie versuchen, zwei Iteratoren zu vergleichen. Der Fehler versucht nur, a.end() zu const vector<T>& zu konvertieren, da das die Übereinstimmung ist, die es für != fand. Einfach Fix !=, um einen Iterator als zweites Argument zu nehmen, und alles wird gut.

Verwandte Themen