试写模板类的过程中,试运行时编译器报错找不到析构函数,尝试使用其他公有的成员函数时也有相同的问题
//“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