我在编码链接列表模板时遇到问题。它可以编译,但是出现以下错误:
1> main.obj:错误LNK2019:未解析的外部符号“公共:__ thiscall LinkedList ::〜LinkedList(void)”(?? 1?$ LinkedList @ H @@ QAE @ XZ)在函数_main中引用
1> main.obj:错误LNK2019:未解析的外部符号“ public:void __thiscall LinkedList :: deleteNode(int)”(?deleteNode @?$ LinkedList @ H @@ QAEXH @ Z)在函数_main中引用
1> main.obj:错误LNK2019:未解析的外部符号“公共:无效__thiscall LinkedList :: displayList(void)”(?displayList @?$ LinkedList @ H @@ QAEXXZ)在函数_main中引用
1> main.obj:错误LNK2019:未解析的外部符号“ public:void __thiscall LinkedList :: insertNode(int)”(?insertNode @?$ LinkedList @ H @@ QAEXH @ Z)
1> c:\ users \ pr0hz \ documents \ Visual Studio 2010 \ Projects \ ListTemplate \ Debug \ ListTemplate.exe:致命错误LNK1120:4个未解决的外部组件
在过去的几个小时里,我一直盯着屏幕尝试解决此问题,对您的帮助将不胜感激。这是我的代码:
main.cpp
#include <iostream>
#include <conio.h>
#include "LinkedList.h"
using namespace std;
int main()
{
LinkedList<int> list;
list.insertNode(5);
list.insertNode(7);
list.insertNode(1);
list.insertNode(19);
list.insertNode(16);
list.insertNode(22);
cout << "\nDisplay the list: \n";
list.displayList();
cout << endl;
list.deleteNode(16);
cout << "\nDisplay node with 16 deleted: \n";
list.displayList();
cout << endl;
LinkedList<int> list2 = list;
cout << "\nDisplay List 2: \n";
list2.displayList();
cout << endl;
getch();
return 0;
}
LinkedList.h
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include <iostream>
using namespace std;
template <class T>
class LinkedList
{
private:
struct ListTemplate
{
T value;
ListTemplate *next;
};
ListTemplate *head;
public:
//Constructor
LinkedList()
{ head = NULL; }
//Destructor
~LinkedList();
//Copy Constructor
LinkedList(ListTemplate &obj)
{
ListTemplate *nodePtr = &obj; //Move through the list
ListTemplate *newNode = new ListTemplate;
if(!head)
return;
else
{
newNode = head;
while(nodePtr->next)
{
nodePtr = nodePtr->next;
newNode->next = nodePtr;
}
}
}
void appendNode(T);
void insertNode(T);
void deleteNode(T);
void displayList();
};
#endif
LinkedList.cpp
#include "LinkedList.h"
#include <iostream>
using namespace std;
template <class T>
void LinkedList<T>::appendNode(T newValue)
{
ListTemplate *newNode; //Point to the new node
ListTemplate *nodePtr; //Move through the list
//Allocate new node and store num there
newNode = new ListTemplate;
newNode->value = num;
newNode->next - NULL;
if(!head)
head = newNode;
else
{
//Initialize the nodePtr as head to move through the list
nodePtr = head;
//While there is still a node, we move through it until there is no more
while (nodePtr->next)
nodePtr = nodePtr->next;
//Append the node
nodePtr->next = newNode;
}
}
template <class T>
void LinkedList<T>::insertNode(T newValue)
{
ListTemplate *newNode; //New Node
ListTemplate *nodePtr; //Move through the list
ListTemplate *previousNode = NULL; //The previous node
//Allocate new node and store num
newNode = new ListTemplate;
newNode->value = num;
//If no node, new node is head
if (!head)
{
head = newNode;
newNode->next = NULL;
}
else //Insert node where it needs to be
{
nodePtr = head; //Beginning position
previousNode = NULL;
//Skip nodes that are less than newNode
while(nodePtr != NULL && nodePtr->value < num)
{
previousNode = nodePtr;
nodePtr = nodePtr->next;
}
//If newNode is the 1st in the list, insert it in slot 1
if (previousNode == NULL)
{
head = newNode;
newNode->next = nodePtr;
}
else //Insert after previous node
{
previousNode->next = newNode;
newNode->next = nodePtr;
}
}
}
template <class T>
void LinkedList<T>::deleteNode(T searchNum)
{
ListTemplate *nodePtr;
ListTemplate *previousNode;
//If the list is empty, do nothing
if(!head)
return;
//See if the first node is the one
if(head->value == num)
{
nodePtr = head->next;
delete head;
head = nodePtr;
}
else //Find the node to delete
{
nodePtr = head;
//Skip the nodes not equal to num
while (nodePtr != NULL && nodePtr->value != num)
{
previousNode = nodePtr;
nodePtr = nodePtr->next;
}
//Delete node and link previous node to the one of the one being deleted
if (nodePtr)
{
previousNode->next = nodePtr->next;
delete nodePtr;
}
}
}
template <class T>
LinkedList<T>::~LinkedList()
{
ListTemplate *nodePtr;
ListTemplate *nextNode;
nodePtr = head;
while (nodePtr != NULL)
{
nextNode = nodePtr->next;
delete nodePtr;
nodePtr = nextNode;
}
}
template <class T>
void LinkedList<T>::displayList()
{
ListTemplate *nodePtr;
nodePtr = head;
while(nodePtr)
{
cout << nodePtr->value << " ";
nodePtr = nodePtr->next;
}
}
再次感谢您的帮助!
您不应该在源文件中实现模板功能。
参见此处-为什么只能在头文件中实现模板?
尝试将所有模板函数移到头文件(LinkedList.h)中,然后重新编译
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句