c++代码错误,创建对象时错误?

这个代码如果不创建对象的话可以通过编译,但一创建对象就出现这样的错误

图片说明

//类声明
#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时,编译器此时才为该模板生成可执行的代码。
但你的头文件中找不到模板的代码,因此就会报错了。

不创建对象时模板不会被实例化,对于编译链接过程,这文件自然是没有问题的,或者说甚至是不存在的,因此自然不会报错。