c++classsortingoopring

Sorting a ring buffer class objects


I am trying to make a sorting function for a ring buffer class object, but it gives me the below error and I couldn't remove it:

template placeholder type 'ring' must be followed by a simple declarator-id

argument list for class template "ring" is missing

'arr' was not declared in this scope

(arr) was declared in the parameter of the function but yet it does not recognize it

hopefully someone can explain what is wrong with the sorting function, here is below my code:

#include<iostream>
#include<initializer_list>
template<typename T>
void swap(T& x, T& y) {
    T temp;
    temp = x;
    x = y;
    y = temp;
}

template<typename T>
class ring {

public:
    class iterator;

public:
    ring(std::initializer_list<T>elements) {
        sze = elements.size();
        value = new T[sze];
        for (auto& i : elements) {
            add(i);
        }
    }

    T& get(int x) { return value[x]; }

    std::size_t size() { return sze; }

    void add(T v) {
        value[index++] = v;
        if (index == sze)
            index = 0;
    }
    iterator begin() { return iterator(0, *this); }
    iterator end() { return iterator(sze, *this); }

    friend void BubbleSort(ring& arr, std::size_t n);

    ~ring() { delete[] value; }

private:
    int index = 0;
    std::size_t sze;
    T* value;
    };

template<typename T>
class ring<T>::iterator {
public:

    iterator(int x, ring& y) :index(x), obj(y) {}
    iterator& operator++() { index++; return *this; }
    iterator& operator++(int x) { index++; return *this; }
    bool operator!=(const iterator& other) { return index != other.index; }
    T& operator*() { return obj.get(index); }

private:
    int index;
    ring& obj;
};
template<typename T>
void BubbleSort(ring& arr, std::size_t n) { // here is the function of the sorting.
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr.value[j] > arr.value[j + 1]) {
                swap(arr.value[j], arr.value[j + 1]);
            }
        }
    }
}

Solution

  • Your friendly compiler showed you already the problem and in which line it happened.

    And it gave you 3 error messages telling you exactly what the problem is.

    See my compiler output enter image description here

    Your class ring needs a template parameter. So same as in line 49 of the picture.

    The below will compile.

    #include<iostream>
    #include<initializer_list>
    template<typename T>
    void swap(T& x, T& y) {
        T temp;
        temp = x;
        x = y;
        y = temp;
    }
    
    template<typename T>
    class ring {
    
    public:
        class iterator;
    
    public:
        ring(std::initializer_list<T>elements) {
            sze = elements.size();
            value = new T[sze];
            for (auto& i : elements) {
                add(i);
            }
        }
    
        T& get(int x) { return value[x]; }
    
        std::size_t size() { return sze; }
    
        void add(T v) {
            value[index++] = v;
            if (index == sze)
                index = 0;
        }
        iterator begin() { return iterator(0, *this); }
        iterator end() { return iterator(sze, *this); }
    
        friend void BubbleSort(ring& arr, std::size_t n);
    
        ~ring() { delete[] value; }
    
    private:
        int index = 0;
        std::size_t sze;
        T* value;
        };
    
    template<typename T>
    class ring<T>::iterator {
    public:
    
        iterator(int x, ring& y) :index(x), obj(y) {}
        iterator& operator++() { index++; return *this; }
        iterator& operator++(int x) { index++; return *this; }
        bool operator!=(const iterator& other) { return index != other.index; }
        T& operator*() { return obj.get(index); }
    
    private:
        int index;
        ring& obj;
    };
    template<typename T>
    void BubbleSort(ring<T>& arr, std::size_t n) { // here is the function of the sorting.
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - i - 1; j++) {
                if (arr.value[j] > arr.value[j + 1]) {
                    swap(arr.value[j], arr.value[j + 1]);
                }
            }
        }
    }
    

    I did not check the functionality. Sorting a ringbuffer sounds somehow strange . . .