Не получается добавить контейнер в шаблонный класс
Пишу шаблонный класс для очереди с приоритетами. Пока есть такой код
#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();
думаю, потихоньку разберетесь...
Да, на будущее: прочтите описание метки шаблоны — она для вашего вопроса не годится никак.