模板类找不到析构函数

问题遇到的现象和发生背景

试写模板类的过程中,试运行时编译器报错找不到析构函数,尝试使用其他公有的成员函数时也有相同的问题

用代码块功能插入代码,请勿粘贴截图
//“queue.h"
#pragma once

#define INIT_QUEUE_NODECOUNT 0
#define INIT_ITEM default_item

template<typename item>
const item default_item;

template<typename item>
struct node
{
    item data = INIT_ITEM;
    node* next = nullptr;
    node* prev = nullptr;
};

template<typename item>
class queue
{
private:
    node* head = nullptr;
    node* tail = nullptr;
    unsigned node_count = INIT_QUEUE_NODECOUNT;
public:
    inline queue() {}
    queue(const queue& q);
    virtual ~queue();
    const queue& operator+(const queue& q)const;
    const queue& operator=(const queue& q);
    void EnQueue(const item& i);
    const item& DeQueue();
    void ShowQueue()const;
};
//"queue.cpp"
#include 

#include "queue.h"

using std::cout;
using std::endl;

template<typename item>
queue::queue(const queue& q)
{
    node* temp = nullptr, * current = head;
    for (node* current_q = q.head; current_q != nullptr; current_q = current_q->next)
    {
        current = new node;
        current->data = current_q->data;
        if (current != head) current->prev = temp;
        temp = current;
        current = current->next;
    }
    tail = temp;
    node_count = q.node_count;
}

template<typename item>
queue::~queue()
{
    node* temp = nullptr;
    for (node* current = head; current != nullptr; current = current->next)
    {
        if (temp != head) delete temp;
        temp = current;
    }
    delete temp;
    temp = nullptr;
    head = nullptr;
    tail = nullptr;
    node_count = INIT_QUEUE_NODECOUNT;
}

template<typename item>
const queue& queue::operator+(const queue& q)const
{
    queue result(*this);
    node* temp = result.tail, * current = result.tail->next;
    for (node* current_q = q.head; current_q != nullptr; current_q = current_q->next)
    {
        current = new node;
        current->data = current_q->data;
        current->prev = temp;
        temp = current;
        current = current->next;
    }
    result.tail = temp;
    result.node_count += q.node_count;
    return result;
}

template<typename item>
const queue& queue::operator=(const queue& q)
{
    if (this == &q) return *this;

    node* temp = nullptr;
    for (node* current = head; current != nullptr; current = current->next)
    {
        if (temp != head) delete temp;
        temp = current;
    }
    delete temp;
    temp = nullptr;
    head = nullptr;
    tail = nullptr;
    node_count = INIT_QUEUE_NODECOUNT;

    node* current = head;
    for (node* current_q = q.head; current_q != nullptr; current_q = current_q->next)
    {
        current = new node;
        current->data = current_q->data;
        if (current != head) current->prev = temp;
        temp = current;
        current = current->next;
    }
    tail = temp;
    node_count = q.node_count;

    return *this;
}

template<typename item>
void queue::EnQueue(const item& i)
{
    if (node_count)
    {
        tail->next = new node;
        tail->next->data = i;
        tail->next->prev = tail;
    }
    else
    {
        head = new node;
        head->data = i;
        tail = head;
    }
    node_count++;
}

template<typename item>
const item& queue::DeQueue()
{
    node* temp = nullptr;
    item temp_item = INIT_ITEM;
    if (node_count)
        if (head == tail)
        {
            temp_item = head->data;
            delete head;
            head = nullptr;
            tail = nullptr;
            node_count = INIT_QUEUE_NODECOUNT;
        }
        else
        {
            temp = tail;
            tail = tail->prev;
            temp_item = temp->data;
            delete temp;
            node_count--;
        }
    return temp_item;
}

template<typename item>
void queue::ShowQueue()const
{
    cout << "The queue's information:" << endl;
    unsigned count = 1;
    for (node* current = head; current != nullptr; current = current->next)
    {
        cout << "#" << count << ":" << endl;
        cout << current->data << endl;
        count++;
    }
}
//"main.cpp"
#include 

#include "queue.h"

using std::cout;
using std::cin;
using std::endl;

int main()
{
    queue<int> test;

    return 0;
}
运行结果及报错内容

严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK1120 1 个无法解析的外部命令


    Homework_1    P:\C & C++ Programs\Homework\Homework_1\x64\Debug\Homework_1.exe    1    

严重性 代码 说明 项目 文件 行 禁止显示状态
警告 LNK4042 对象被多次指定;已忽略多余的指定


Homework_1    P:\C & C++ Programs\Homework\Homework_1\x64\Debug\queue.obj    1    

严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2019 无法解析的外部符号


"public: virtual __cdecl queue::~queue(void)" (??1?$queue@H@@UEAA@XZ),函数 "public: virtual void * __cdecl queue::`scalar deleting destructor'(unsigned int)" (??_G?$queue@H@@UEAAPEAXI@Z) 中引用了该符号    Homework_1    P:\C & C++ Programs\Homework\Homework_1\main.obj    1