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: 615
        
//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