L
L
Li_Berraz2014-10-12 16:58:30
C++ / C#
Li_Berraz, 2014-10-12 16:58:30

Problem with template class methods. How to decide?

Here, in fact, is the problem.
Class declaration:

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

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

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

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

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

Next, the implementation of the class, here is the code of the specific methods with which the problem is:
T & tail()
  {
    if (nCount == 0) throw QueueUnderflow();

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

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

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

VS2013 throws
error C4716: Queue::tail: must return a value
error C4716: Queue::head: must return a value
Here is the complete template code:
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]; // Ссылка на хвостовой элемент
  }

};

Answer the question

In order to leave comments, you need to log in

1 answer(s)
M
Misha Krinkin, 2014-10-12
@Li_Berraz

You have assigned an empty body to all methods in the class - of course the compiler swears.
UPD: make them purely virtual then.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question