Задать вопрос
@Li_Berraz

Проблема с методами шаблонного класса. Как решить?

Вот, собственно, проблема.

Объявление класса:

template <class T>
class Queue
{
public:
	virtual void enqueue(const T & e) {}; //Добавление элемента в очередь

	virtual void dequeue(){}; //Удаление элемента из головы очереди

	virtual void empty(){}; //Проверка на пустоту очереди

	virtual T & tail(){}; //Ссылка на хвост

	virtual T & head(){}; //Ссылка на голову
};

Далее реализация класса, вот код конкретных методов, с которыми проблема:

T & tail()
	{
		if (nCount == 0) throw QueueUnderflow();

		return elements[pTail]; // Ссылка на хвостовой элемент
	}

	T & head()
	{
		if (nCount == 0) throw QueueUnderflow();

		return elements[pHead]; // ссылка на головной элемент
	}


VS2013 выдаёт

error C4716: Queue::tail: должна возвращать значение
error C4716: Queue::head: должна возвращать значение

Вот полный код шаблона:
template <class T>
class Queue
{
public:
	virtual void enqueue(const T & e) {}; //Добавление элемента в очередь

	virtual void dequeue(){}; //Удаление элемента из головы очереди

	virtual void empty(){}; //Проверка на пустоту очереди

	virtual T & tail(){}; //Ссылка на хвост

	virtual T & head(){}; //Ссылка на голову
};

template <class T>

class BoundQueue : public Queue < T >
{
	T *elements; // Массив элементов очереди
	int maxSize; // Количество элементов в массиве
	int pHead; // Индекс первого элемента
	int pTail; // Индекс последнего элемента
	int nCount; // Количество элементов

public:
	BoundQueue(int size = 10);

	BoundQueue(const BoundQueue<T> & scr);

	virtual ~BoundQueue() { delete[] elements; }

	void enqueue(const T & item)
	{
		if (nCount == maxSize) throw QueueOverflow();

		if (++pTail == maxSize) pTail = 0;

		elements[pTail] = item;
		nCount++;
	}

	void dequeue()
	{
		if (nCount == 0) throw QueueUnderflow();

		if (++pHead == maxSize) pHead = 0;

		nCount--;
	}

	bool empty() const { return nCount == 0; }

	//Доступ к головному элементу очереди

	T & head()
	{
		if (nCount == 0) throw QueueUnderflow();

		return elements[pHead]; // ссылка на головной элемент
	}


	//Доступ к хвостовому элементу

	T & tail()
	{
		if (nCount == 0) throw QueueUnderflow();

		return elements[pTail]; // Ссылка на хвостовой элемент
	}

};
  • Вопрос задан
  • 2229 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
Вы в классе ко всем методам приписали пустое тело - конечно компилятор ругается.
UPD: сделайти их что ли чисто виртуальными тогда.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы