печать элементов очереди с использованием <list>(ошибка C2760) - PullRequest
0 голосов
/ 05 октября 2018

Попытка реализовать очередь с использованием двусвязного списка из <list>, и я получаю следующую ошибку для моей функции print(): error C2760: syntax error: unexpected token 'identifier', expected ';'

Код для класса очереди::

#ifndef DLL_QUEUE
#define DLL_QUEUE
#include <list>
#include <iostream>

using namespace std;

template<class T>
class Queue {
public:
    Queue() {
    }
    void clear() {
        lst.clear();
    }
    bool isEmpty() const {
        return lst.empty();
    }
    T& front() {
        return lst.front();
    }
    T dequeue() {
        T el = lst.front();
        lst.pop_front();
        return el;
    }
    void enqueue(const T& el) {
        lst.push_back(el);
    }
    void print() {
        for (list<T>::const_iterator i = this->front(); i != this->back(); ++i)
            cout << *i;
        cout << "\n";
    }
private:
    list<T> lst;
};
#endif

Основной метод, который вызывает класс:

#include <iostream>
#include "genQueue.h"

using namespace std;

int main() {

    //"genQueue.h"
    Queue<int> *queue1 = new Queue<int>();
    for (int k = 0; k < 100; k++)
        queue1->enqueue(k);
    queue1->print();



    system("PAUSE");
    return 0;
}

1 Ответ

0 голосов
/ 05 октября 2018

Давайте внимательно рассмотрим функцию 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 («пауза»);- Почему это неправильно? .

...