я правильно реализую этот класс шаблона? - PullRequest
2 голосов
/ 29 января 2010

Хорошо, я пытаюсь реализовать шаблонный класс очереди на основе массива с именем Queue. Вот как я это сделал. Во-первых, это правильный способ реализации шаблонного класса? Проблема в том, что, когда я пытаюсь скомпилировать, я получаю сообщения об ошибках

неопределенная ссылка на "Очередь :: Queue ()
неопределенная ссылка на 'Queue :: ~ Queue ()

Есть идеи, что случилось? Я объявляю это неправильно или неправильно реализую?

queue.h

#ifndef __QUEUE_H__
#define __QUEUE_H__

template <class T>
class Queue
{
    int first;
    T* array;

  public:
    Queue();
    ~Queue;
    void enqueue(T next);
    T dequeue();
    bool is_empty();
    bool is_full();

};

#endif

queue.cpp

#include "queue.h"

template <class T> Queue<T>::Queue(){
    ...
}
template <class T> Queue<T>::~Queue(){
    ...
}
template <class T> void Queue<T>::enqueue(T next){
    ...
}
template <class T> T Queue<T>::dequeue(){
    ...
}
template <class T> bool Queue<T>::is_empty(){
    ...
}
template <class T> bool Queue<T>::is_full(){
    ...
}

main.cpp

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

using namespace std;

int main(){
  Queue<int> test;
  return 0;
}

Ответы [ 2 ]

9 голосов
/ 29 января 2010

Несколько выпусков:

  • Причина вашей проблемы - C ++ на самом деле не поддерживает разбиение шаблонов на файлы .h и .cpp - вам нужно поместить все в заголовок

  • Имя __QUEUE_H__ зарезервировано для реализации C ++, как и все имена, которые содержат двойные подчеркивания или начинаются с подчеркивания и заглавной буквы. Вы не можете создавать такие имена в своем собственном коде.

  • Вероятно, вам будет удобнее реализовать очередь в терминах std :: deque, а не в массиве в стиле C

  • Я предполагаю, что вы делаете это как учебное упражнение, но если нет, вы должны знать, что стандартная библиотека C ++ уже содержит класс шаблона std :: queue.

1 голос
/ 30 января 2010

Шаблон - это просто необычная форма макроса, о которой знает компилятор, почти для каждой реализации C ++. Должны присутствовать определения, чтобы компилятор мог генерировать код вместо шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...