可能重複:
What is an undefined reference/unresolved external symbol error and how do I fix it?C++:錯誤LNK2019:解析外部符號
所以我比較我的問題已經從這一類衍生本網站的問題,廣大圖書館。我仍然不知道爲什麼我的編譯器在抱怨。
因此,讓我簡單介紹一下我想用我的程序做什麼。我正在研究電梯算法。我想要使用二進制堆實現優先級隊列。
我已經從馬克艾倫維斯網站的源代碼。對於堆。
我正在構建我自己的代表二叉樹節點的reqnode類。
reqnode =請求節點。
該方案是:用戶提出請求。我服務請求。我正在處理多個請求。因此,我必須使用首先滿足哪個用戶的優先級。
這是我的二進制堆的頭文件。
#include <vector>
using namespace std;
BinaryHeap class.
CONSTRUCTION: with no parameters or vector containing items.
template <class Comparable>
class BinaryHeap
{
public:
BinaryHeap();
BinaryHeap(const vector<int> & v);
bool isEmpty() const;
const Comparable & findMin() const;
void insert(const Comparable & x);
void deleteMin();
void deleteMin(Comparable & minItem);
void makeEmpty();
private:
int theSize; // Number of elements in heap
vector<Comparable> Array; // The heap Array
void buildHeap();
void percolateDown(int hole);
};
這些是爲我的二進制堆定義的函數。
#include "binaryHeap.h"
using namespace std;
// Construct the binary heap.
template <class Comparable>
BinaryHeap<Comparable>::BinaryHeap()
: Array(11), theSize(0)
{
}
// Insert item x into the priority queue, maintaining heap order.
// Duplicates are allowed.
template <class Comparable>
void BinaryHeap<Comparable>::insert(const Comparable & x)
{
Array[ 0 ] = x; // initialize sentinel
if(theSize + 1 == Array.size())
Array.resize(Array.size() * 2 + 1);
// Percolate up
int hole = ++theSize;
for(; x < Array[ hole/2 ]; hole /= 2)
Array[ hole ] = Array[ hole/2 ];
Array[ hole ] = x;
}
// Find the smallest item in the priority queue.
// Return the smallest item, or throw UnderflowException if empty.
template <class Comparable>
const Comparable & BinaryHeap<Comparable>::findMin() const
{
if(isEmpty()){
cout << "heap empty" << endl; //throw UnderflowException();
break;
}
return Array[ 1 ];
}
// Remove the smallest item from the priority queue.
// Throw UnderflowException if empty.
template <class Comparable>
void BinaryHeap<Comparable>::deleteMin()
{
if(isEmpty()){
cout << "heap empty" << endl; //throw UnderflowException();
break;
}
Array[ 1 ] = Array[ theSize-- ];
percolateDown(1);
}
// Remove the smallest item from the priority queue
// and place it in minItem. Throw UnderflowException if empty.
template <class Comparable>
void BinaryHeap<Comparable>::deleteMin(Comparable & minItem)
{
minItem = findMin();
Array[ 1 ] = Array[ theSize-- ];
percolateDown(1);
}
// Establish heap-order property from an arbitrary
// arrangement of items. Runs in linear time.
template <class Comparable>
void BinaryHeap<Comparable>::buildHeap()
{
for(int i = theSize/2; i > 0; i--)
percolateDown(i);
}
// Test if the priority queue is logically empty.
// Return true if empty, false otherwise.
template <class Comparable>
bool BinaryHeap<Comparable>::isEmpty() const
{
return theSize == 0;
}
// Make the priority queue logically empty.
template <class Comparable>
void BinaryHeap<Comparable>::makeEmpty()
{
theSize = 0;
}
// Internal method to percolate down in the heap.
// hole is the index at which the percolate begins.
template <class Comparable>
void BinaryHeap<Comparable>::percolateDown(int hole)
{
int child;
Comparable tmp = Array[ hole ];
for(; hole * 2 <= theSize; hole = child)
{
child = hole * 2;
if(child != theSize && Array[ child + 1 ] < Array[ child ])
child++;
if(Array[ child ] < tmp)
Array[ hole ] = Array[ child ];
else
break;
}
Array[ hole ] = tmp;
}
這是爲了reQnode
class reqNode//create a node that takes in several properties.
{
public:
reqNode(){ //default constructor
static priority = start = destination = timestamp = start_time = finish_time = -1;
}
reqNode(const reqNode ©){ //copy constructor
priority = copy.priority;
start = copy.start;
destination = copy.destination;
timestamp = copy.timestamp;
start_time = copy.start_time;
finish_time = copy.finish_time;
}
reqNode & operator=(const reqNode & copy){
priority = copy.priority;
start = copy.start;
destination = copy.destination;
timestamp = copy.timestamp;
start_time = copy.start_time;
finish_time = copy.finish_time;
return *this;
}
int priority, start, destination, timestamp, start_time, finish_time;
bool direction;
bool operator<(reqNode &rhs){
if(this->priority < rhs.priority)
return true;
else
return false;
}
void setPriority(int x){
priority=x;
}
};
我的頭文件,這是我的驅動程序實現
#include <iostream>
#include <fstream>
#include <string>
#include "binaryHeap.h"
#include "reqnode.h"
#include <algorithm>
using namespace std;
void setNode(reqNode nizzode, int priority)
{
nizzode.priority = priority;
}
int main()
{
int numItems = 10000;
BinaryHeap<reqNode> h;
int i = 37;
reqNode x;
reqNode * temp;
for(i = 37; i != 0; i = (i + 37) % numItems){
temp = new reqNode;
temp->setPriority(i);
h.insert(*temp);
}
for(i = 1; i < numItems; i++)
{
h.deleteMin(x);
if(x.priority != i)
cout << "Oops! " << i << endl;
}
for(i = 37; i != 0; i = (i + 37) % numItems){
temp = new reqNode;
temp->setPriority(i);
h.insert(*temp);
}
temp = new reqNode;
temp->setPriority(i);
h.insert(*temp);
return 0;
}
最後,這些都是困擾着我的錯誤!
1>Driver2.obj : error LNK2019: unresolved external symbol "public: void __thiscall BinaryHeap<class reqNode>::deleteMin(class reqNode &)" ([email protected][email protected]@@@@[email protected]@@Z) referenced in function _main
1>Driver2.obj : error LNK2019: unresolved external symbol "public: void __thiscall BinaryHeap<class reqNode>::insert(class reqNode const &)" ([email protected][email protected]@@@@[email protected]@@Z) referenced in function _main
1>Driver2.obj : error LNK2019: unresolved external symbol "public: __thiscall BinaryHeap<class reqNode>::BinaryHeap<class reqNode>(void)" ([email protected]@@@@[email protected]) referenced in function _main
1>C:\Users\Aaron Artis\Documents\Visual Studio 2010\Projects\Elevator_Algo_Remix1\Debug\Elevator_Algo_Remix1.exe : fatal error LNK1120: 3 unresolved externals
我不確定在哪裏查明這個問題。我有一個以前的鏈接器錯誤。我解決了它。這個看起來像是一個愚蠢的人。
您的模板方法是在.h或.cpp中定義的嗎?通常模板成員在與模板類聲明相同的文件中定義。 – alestanis