0

I am trying to write a vector class which includes a friend function sort(algorithm is bubble sort) and I have some difficulty in this function. This sort function is also a template function of template iterator and iterator is typedef of T* in class vector. Below is my code:

namespace THU {
template <class T>
void iswap(T* a, T* b) {
    T tmp = *a;
    a = b;
    b = &tmp;
}
template <class T>
class iVector {
   protected:
    int _size;
    int use;
    T* _vector;

   public:
    typedef T* iterator;
    iVector(int n) : _size(n) {
        _vector = new T[n];
        use = 0;
    }
    iterator begin() { return _vector; }
    iterator end() { return begin() + use; }
    void clear() { use = 0; }
    bool empty() const {
        if (use == 0)
            return true;
        else
            return false;
    }
    void pop_back() {
        if (use > 0) {
            use -= 1;
        } else
            throw use;
    }
    void push_back(const T& v) {
        if (use < _size) {
            _vector[use] = v;
            use++;
        } else
            throw use;
    }
    T& operator[](int n) {
        if (n >= 0 && n < use) {
            return _vector[n];
        } else
            throw use;
    }
    friend void sort<iterator>(iterator begin, iterator end);
    void print() {
        for (int i = 0; i < use; i++)
            std::cout << _vector[i] << " ";
        std::cout << std::endl;
    }
};
template <class iterator>
void sort(iterator begin, iterator end) {
    iterator i = end - 1;
    for (; i != begin; i--) {
        iterator j = begin;
        for (; j != i; j++) {
            if (*j > *(j + 1))
                iswap(j, j + 1);
        }
    }
}
}  // namespace THU

and it meets error in the title. Can anyone help me?

songyuanyao
  • 169,198
  • 16
  • 310
  • 405
dubugger
  • 89
  • 6

1 Answers1

2

You need to declare sort in advance; or move the definition of sort before the definition of iVector directly. E.g.

template <class iterator>
void sort(iterator begin, iterator end);

template <class T>
class iVector {
    ...
    friend void sort<iterator>(iterator begin, iterator end);
    ...
};

...

If you want to declare template friend, it should be

template <class T>
class iVector {
    ...
    // friend declaration
    template <class iterator>
    friend void sort(iterator begin, iterator end);
    ...
};

// definition
template <class iterator>
void sort(iterator begin, iterator end) {
    ...
}
songyuanyao
  • 169,198
  • 16
  • 310
  • 405