这个代码如果不创建对象的话可以通过编译,但一创建对象就出现这样的错误
//类声明
#ifndef QUEUETP_H
#define QUEUETP_H
template < class Item >
class QueueTP{
private:
enum{Q_SIZE = 10};
class Node{ //嵌套类,在私有部分声明,仅对该类公有方法可见
public:
Node * next;
Item item;
Node(const Item & it) : next(NULL), item(it) { }
};
Node * front; //头指针
Node * rear; //尾指针
int items;
const int qsize; //限制队列长度
QueueTP (const QueueTP & q) { }
QueueTP & operator=(const QueueTP & q) { }
public:
QueueTP(int s = Q_SIZE) : qsize(s), items(0), front(NULL), rear(NULL) { }
~QueueTP();
bool isempty();
bool isfull();
bool enqueue(const Item & item);
bool dequeue(Item & item);
int queue_count();
void show() const;
};
#endif
#include <iostream>
#include "queuetp.h"
template <typename Item>
QueueTP < Item > ::~QueueTP()
{
Node * p;
while (front != NULL){
p = front;
front = front -> next;
delete p;
}
}
template <typename Item>
bool QueueTP < Item > ::isempty()
{
return items == 0;
}
template <typename Item>
bool QueueTP < Item > ::isfull()
{
return items == qsize;
}
template <typename Item>
bool QueueTP < Item > ::enqueue(const Item & item)
{
if (isfull())
return false;
Node * temp = new Node(item); //用Node的构造函数创建Node结点
if (front == NULL){
front = temp;
} else {
rear -> next = temp;
}
rear = temp;
items ++;
return true;
}
template <typename Item>
bool QueueTP < Item > ::dequeue(Item & item)
{
if (isempty())
return false;
Node * temp;
temp = front;
front = front -> next;
delete temp;
if (front == NULL) rear = 0;
items ++;
return true;
}
template <typename Item>
int QueueTP < Item > ::queue_count()
{
return items;
}
template <typename Item>
void QueueTP < Item > ::show() const
{
Node * p = front;
for (int i = 1; front != NULL; front = front -> next, i ++){
std::cout << i << ": " << front -> item << std::endl;
}
front = p;
}
你分文件了吧,在C++中,模板类的函数定义必须在一个头文件中,因为模板在定义时不会被实例化。
当你真正实例化了如QueueTP a时,编译器此时才为该模板生成可执行的代码。
但你的头文件中找不到模板的代码,因此就会报错了。
不创建对象时模板不会被实例化,对于编译链接过程,这文件自然是没有问题的,或者说甚至是不存在的,因此自然不会报错。