好的,我正在尝试实现一个名为Queue的基于数组的队列的模板化类。 这就是我做到的。首先,这是实现模板类的正确方法吗? 问题是,当我尝试编译时,我收到错误消息
未定义的引用 '队列::队列()'
未定义的引用 '队列::〜队列()'
任何想法有什么不对?我声明错误或执行错误吗?
#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
#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(){
...
}
#include "queue.h"
#include <iostream>
using namespace std;
int main(){
Queue<int> test;
return 0;
}
答案 0 :(得分:9)
几个问题:
您的问题的原因 - C ++并不支持将模板拆分为.h和.cpp文件 - 您需要将所有内容放入标题中
名称__QUEUE_H__
是为C ++实现保留的,所有名称都包含双下划线或以下划线和大写字母开头。您不能在自己的代码中创建此类名称。
你可能会发现用std :: deque而不是C风格的数组实现队列更方便
我假设您这样做是为了学习练习,但如果不是,您应该知道C ++标准库已经包含了std :: queue模板类。
答案 1 :(得分:1)
对于几乎C ++的每个实现,模板实际上只是编译器所知道的一种奇特的宏形式。必须存在定义,以便编译器可以生成代码来代替模板。