mardi 5 avril 2016

Error in iterator while implementing doubly linked list in C++

I am getting an ambiguous error in which I am trying to implement the iterator of a link list class. The program says that the function is not a part of my class, when it is.

Tester program:

for(list<int>::iterator it = l3.begin() ; it!=l3.end(); ++it)
        cout<<(int)(it.value())<<" ";

Link List Class:

template<typename T>
class list
{
    int len;
    link<T>* head, tail;
    public:
        /*class functions*/

        class iterator{
            link<T>* ptr;
            public:
                iterator() {ptr = nullptr;}
                iterator(link<T>* p) {ptr = p;}
                link<T>* get_ptr(){return ptr;}
                iterator(iterator a){ptr = a.get_ptr();}
                ~iterator(){delete[] ptr;}
                T& value(){return ptr->get_val();}
                void operator=(iterator iter){ptr = iter.get_ptr();}
                bool operator==(iterator iter){return ptr == iter.get_ptr();}
                void operator++(){ptr = ptr->get_next();}
                void operator--(){ptr = ptr->get_prev();}
                bool operator!=(iterator iter){return ptr != iter.get_ptr();}  
        };
        iterator begin(){return iterator(head);}
        iterator end(){return iterator(nullptr);};
};

Error:

listtest.cpp: In function ‘int main(int, const char**)’:
listtest.cpp:24:19: error: ‘class mod::list<int>::iterator’ has no member named ‘value’
cout<<(int)(it.value())<<" ";

I have commented the definitions of all the functions of the list class, but still am getting the same error. This is my link class, which acts as node to the list class.

template<typename T>
class list;

template<typename T>
class link{
    template<typename U>
        friend class list;
    private:
        T value;
        link<T>* prev; 
        link<T>* next;
    public:
        link(){prev = next = nullptr;}
        link(const T& val){value = val; prev = next = nullptr;}
        T& get_val(){return value;}
        link<T>* get_prev(){return prev;}
        link<T>* get_next(){return next;}           
};

Aucun commentaire:

Enregistrer un commentaire