Не получается добавить контейнер в шаблонный класс

Пишу шаблонный класс для очереди с приоритетами. Пока есть такой код

#include <iostream>
#include <vector>

using namespace std;

template<typename T, class Container>
class priority_queue {
    Container<T> _container;

    /**
     * Возвращает индекс левого ребёнка по индексу родителя
     * 2*i + 1
     */
    int _leftChildIndex(int parentIndex){
        return 2 * parentIndex + 1;
    }

    /**
     * Возвращает индекс правого ребёнка по индексу родителя
     * 2*i + 2
     */
    int _rightChildIndex(int parentIndex) {
        return 2 * parentIndex + 2;
    }

    /**
     * Возвращает индекс родителя по индексу ребёнка
     * (int)(0.5 * i + 0.5) - 1
     */
    int _parentIndex(int childIndex) {
        (int)(0.5 * childIndex + 0.5) - 1;
    }

    /**
     * "Просеивание" вверх
     */
    void _siftUp(int index) {
        //повторять пока если потомок меньше предка то обменять их местами
        while (_container[index] < _container[_parentIndex(index)]) {
            swap(_container[index], _container[_parentIndex(index)]);
            index = _parentIndex(index);
        }
    }

    /**
     * "Просеивание" вниз
     */
    void _siftDown(int index) {
        while (2 * index + 1 < _container.size()) {
            int left = _leftChildIndex(index);
            int right = _rightChildIndex(index);
            int j = left;
            if (right < _container.size() && _container[right] < _container[left])
                j = right;
            if (_container[index] <= _container[j]) break;
            else swap(_container[index], _container[j]);
            index = j;
        }
    }

public:
    /**
     * Добавление элемента в очередь
     * Реализуется через siftUp
     */
    void push(int x) {
        _container.push_back(x);
        _siftUp(_container.size() - 1);
    }

    /**
     * Возвращает верхний элемент очереди,
     * НЕ удаляя его
     *
     * Возвращает первый элемент
     */
    T top() const {
        return _container[0];
    }

    /**
     * Возвращает верхний элемент очереди,
     * удаляя его
     *
     * Возвращает первый элемент, удаляет его, делает siftDown
     */
    T pop() {
        T t = _container[0];
        _container[0] = _container.pop_back();
        _siftDown(0);
        return t;
    }

    /**
     * Проверяет, пустая очередь или нет
     */
    bool empty() const {
        if (_container.size == 0) return true;
        else return false;
    }
};

int main() {
    priority_queue<int, vector> q;
    q.push(45);
    q.push(11);
    q.push(12);
    q.push(7);
    q.push(100);

    q.top(); // == 100
    q.pop(); // == 100

    q.empty();

    while (!q.empty())
        std::cout << q.pop();
}

Компилятор (MS Visual Studio) ругается на строчку Container<T> _container; А что он хочет понять не могу.


Ответы (1 шт):

Автор решения: Harry

Поясните ему, что Container сам по себе шаблон:

template<typename T,template<typename> class Container>
class priority_queue {
    Container<T> _container;

Но это не единственная неприятность в вашем коде; ну, со всякими чудесами типа

_container[0] = _container.pop_back();

думаю, потихоньку разберетесь...

Да, на будущее: прочтите описание метки шаблоны — она для вашего вопроса не годится никак.

→ Ссылка