Давайте внимательно рассмотрим функцию print
:
void print() {
for (list<T>::const_iterator i = this->front(); i != this->back(); ++i)
cout << *i;
cout << "\n";
}
Вы определили метод-член T& Queue<T>::front
, который вы пытаетесь вызвать, когда пишете this->front()
.Однако T&
нельзя присвоить List<T>::const_iterator
.Кроме того, this->back()
пытается вызвать метод Queue<T>::back()
, который не существует.
Причина, по которой эти ошибки не проявляются, пока вы не попытаетесь вызвать print()
, заключается в том, что компилятор только создавать шаблонный код, когда это необходимо.Он не будет пытаться создать экземпляр функции, которую вы не вызываете, поскольку функция может бессмысленно не компилироваться для некоторых типов, которые вы не хотите использовать.
Если цель состоит в том, чтобы перебрать содержимое списка участников, вы можете забыть обо всех вышеперечисленных сложностях и использовать надежную дальность для цикла , что намного проще:
void print() {
for (const T& t : lst){
cout << t;
}
}
С другой стороны, нет причин динамически выделять очередь, используя new
.Обратите внимание, что вы не delete
очереди и, следовательно, есть утечка памяти.Вы должны хранить очередь в стеке по значению, если это возможно, чтобы избежать глупых ошибок указателей:
Queue<int> queue1;
for (int k = 0; k < 100; k++)
queue1.enqueue(k);
queue1.print();
Если вам действительно нужна очередь для существования в куче, рассмотрите возможность использованияstd::unique_ptr<Queue<T>>
или std::shared_ptr<Queue<T>>
для указателей, которые автоматически управляют временем их жизни и владельцем.
Дополнительно, обратите внимание на system («пауза»);- Почему это неправильно? .