nested iterator errors

Posted by Sean on Stack Overflow See other posts from Stack Overflow or by Sean
Published on 2011-02-02T05:08:55Z Indexed on 2011/02/02 7:25 UTC
Read the original article Hit count: 537

Filed under:
|
//arrayList.h
 #include<iostream>
#include<sstream>
#include<string>
#include<algorithm>
#include<iterator>

using namespace std;

template<class T>
class arrayList{
public:
    // constructor, copy constructor and destructor
    arrayList(int initialCapacity = 10);
    arrayList(const arrayList<T>&);
    ~arrayList() {
        delete[] element;
    }

    // ADT methods
    bool empty() const {
        return listSize == 0;
    }
    int size() const {
        return listSize;
    }
    T& get(int theIndex) const;
    int indexOf(const T& theElement) const;
    void erase(int theIndex);
    void insert(int theIndex, const T& theElement);
    void output(ostream& out) const;

    // additional method
    int capacity() const {
        return arrayLength;
    }
    void reverse(); // new defined

    // iterators to start and end of list
    class iterator;
    class seamlessPointer;
    seamlessPointer begin() {
        return seamlessPointer(element);
    }
    seamlessPointer end() {
        return seamlessPointer(element + listSize);
    }
    // iterator for arrayList
    class iterator {
    public:
        // typedefs required by C++ for a bidirectional iterator
        typedef bidirectional_iterator_tag iterator_category;
        typedef T value_type;
        typedef ptrdiff_t difference_type;
        typedef T* pointer;
        typedef T& reference;

        // constructor
        iterator(T* thePosition = 0) {
            position = thePosition;
        }

        // dereferencing operators
        T& operator*() const {
            return *position;
        }
        T* operator->() const {
            return position;
        }

        // increment
        iterator& operator++() // preincrement
        {
            ++position;
            return *this;
        }
        iterator operator++(int) // postincrement
        {
            iterator old = *this;
            ++position;
            return old;
        }

        // decrement
        iterator& operator--() // predecrement
        {
            --position;
            return *this;
        }
        iterator operator--(int) // postdecrement
        {
            iterator old = *this;
            --position;
            return old;
        }

        // equality testing
        bool operator!=(const iterator right) const {
            return position != right.position;
        }
        bool operator==(const iterator right) const {
            return position == right.position;
        }
    protected:
        T* position;
    }; // end of iterator class

    class seamlessPointer: public arrayList<T>::iterator {

        // constructor
        seamlessPointer(T *thePosition) { iterator::position = thePosition;
        }
        //arithmetic operators
        seamlessPointer & operator+(int n) {
            arrayList<T>::iterator::position += n;
            return *this;
        }
        seamlessPointer & operator+=(int n) {
            arrayList<T>::iterator::position += n;
            return *this;
        }

        seamlessPointer & operator-(int n) {
            arrayList<T>::iterator::position -= n;
            return *this;
        }
        seamlessPointer & operator-=(int n) {
            arrayList<T>::iterator::position -= n;
            return *this;
        }
        T& operator[](int n) {
            return arrayList<T>::iterator::position[n];
        }
        bool operator<(seamlessPointer &rhs) {
            if(int(arrayList<T>::iterator::position - rhs.position) < 0)
                return true;
            return false;

        }
        bool operator<=(seamlessPointer & rhs) {
            if (int(arrayList<T>::iterator::position - rhs.position) <= 0)
                return true;
            return false;
        }
        bool operator >(seamlessPointer & rhs) {
            if (int(arrayList<T>::iterator::position - rhs.position) > 0)
                return true;
            return false;
        }
        bool operator >=(seamlessPointer &rhs) {
            if (int(arrayList<T>::iterator::position - rhs.position) >= 0)
                return true;
            return false;
        }
    };

protected:
    // additional members of arrayList
    void checkIndex(int theIndex) const;
    // throw illegalIndex if theIndex invalid
    T* element; // 1D array to hold list elements
    int arrayLength; // capacity of the 1D array
    int listSize; // number of elements in list
};

#endif

//main.cpp

#include<iostream>
#include"arrayList.h"
#include<fstream>
#include<algorithm>
#include<string>

using namespace std;


bool compare_nocase (string first, string second)
{
  unsigned int i=0;
  while ( (i<first.length()) && (i<second.length()) )
  {
    if (tolower(first[i])<tolower(second[i])) return true;
    else if (tolower(first[i])>tolower(second[i])) return false;
    ++i;
  }
  if (first.length()<second.length()) return true;
  else return false;
}

int main() {
    ifstream fin;
    ofstream fout;
    string str;
    arrayList<string> dict;

    fin.open("dictionary");
    if (!fin.good()) {
        cout << "Unable to open file" << endl;
        return 1;
    }
    int k=0;
    while(getline(fin,str))
    {
        dict.insert(k,str);
//      cout<<dict.get(k)<<endl;
        k++;
    }
    //sort the array

    sort(dict.begin, dict.end(),compare_nocase);

    fout.open("sortedDictionary");

    if (!fout.good()) {
        cout << "Cannot create file" << endl;
        return 1;
    }

    dict.output(fout);
    fin.close();


    return 0;
}

Two errors are:

..\src\test.cpp: In function 'int main()':
..\src\test.cpp:50:44: error: no matching function for call to 'sort(<unresolved overloaded function type>, arrayList<std::basic_string<char> >::seamlessPointer, bool (&)(std::string, std::string))'

..\src\/arrayList.h: In member function 'arrayList<T>::seamlessPointer arrayList<T>::end() [with T = std::basic_string<char>]':
..\src\test.cpp:50:28:   instantiated from here
..\src\/arrayList.h:114:3: error: 'arrayList<T>::seamlessPointer::seamlessPointer(T*) [with T = std::basic_string<char>]' is private
..\src\/arrayList.h:49:44: error: within this context

Why do I get these errors?

Update I add public: in the seamlessPointer class and change begin to begin() Then I got the following errors:

..\hw3prob2.cpp:50:46:   instantiated from here
c:\wascana\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/stl_algo.h:5250:4: error: no match for 'operator-' in '__last - __first'
..\/arrayList.h:129:21: note: candidate is: arrayList<T>::seamlessPointer& arrayList<T>::seamlessPointer::operator-(int) [with T = std::basic_string<char>, arrayList<T>::seamlessPointer = arrayList<std::basic_string<char> >::seamlessPointer]

c:\wascana\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/stl_algo.h:5252:4:   instantiated from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = arrayList<std::basic_string<char> >::seamlessPointer, _Compare = bool (*)(std::basic_string<char>, std::basic_string<char>)]'
..\hw3prob2.cpp:50:46:   instantiated from here
c:\wascana\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/stl_algo.h:2190:7: error: no match for 'operator-' in '__last - __first'
..\/arrayList.h:129:21: note: candidate is: arrayList<T>::seamlessPointer& arrayList<T>::seamlessPointer::operator-(int) [with T = std::basic_string<char>, arrayList<T>::seamlessPointer = arrayList<std::basic_string<char> >::seamlessPointer]

Then I add operator -() in the seamlessPointer class

ptrdiff_t operator -(seamlessPointer &rhs) {

        return (arrayList<T>::iterator::position - rhs.position);
    }

Then I compile successfully. But when I run it, I found memeory can not read error. I debug and step into and found the error happens in stl function

template<typename _RandomAccessIterator, typename _Distance,
       typename _Tp, typename _Compare>
    void
    __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
          _Distance __len, _Tp __value, _Compare __comp)
    {
      const _Distance __topIndex = __holeIndex;
      _Distance __secondChild = __holeIndex;
      while (__secondChild < (__len - 1) / 2)
    {
      __secondChild = 2 * (__secondChild + 1);
      if (__comp(*(__first + __secondChild),
             *(__first + (__secondChild - 1))))  
        __secondChild--;
      *(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first + __secondChild)); ////// stop here
      __holeIndex = __secondChild;
    }

Of course, there must be something wrong with the customized operators of iterator. Does anyone know the possible reason? Thank you.

© Stack Overflow or respective owner

Related posts about c++

Related posts about iterator