2012-10-21 158 views
0

可能重複:
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){  //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 

我不確定在哪裏查明這個問題。我有一個以前的鏈接器錯誤。我解決了它。這個看起來像是一個愚蠢的人。

+0

您的模板方法是在.h或.cpp中定義的嗎?通常模板成員在與模板類聲明相同的文件中定義。 – alestanis

回答

2

不要將模板定義放在.CPP文件中 - 它們需要位於.H文件中,否則編譯器無法擴展它們。

也許,你甚至不應該需要BinaryHeap.c

+0

我認爲這個事實讓許多人第一次編寫模板代碼時感到震驚。 – john

+0

@john從這個問題(和答案)的重複次數來看,這個問題在SO上非常流行,你的評估當然是有效的。 – WhozCraig

0

它看起來像構造函數的定義,這兩種方法是在一個CPP文件;他們需要在一個頭文件中。

1

你的編譯器是抱怨,因爲它發現聲明的功能構造,deleteMininsert,但不定義

這是由於您的定義必須位於.cpp文件中。

在類聲明之後,將它們直接放入binaryHeap.h文件中,可以解決問題。

想想這樣做的模板功能。

+0

不一定總是。你知道專門的模板嗎? –

+0

是的,我。我只是強調了這樣一個事實,即這不僅僅是爲了解決他的實際錯誤,而是他在處理模板時應該考慮的事情。 – alestanis

+0

當然,但「想到」和「總是這樣做」是完全不同的。當你制定一個規則時,確保覆蓋角落的情況,或者至少不要讓它聽起來那麼嚴格。 –

0

簡答:你應該把你的BinaryHead<>的聲明和定義放在同一個文件中,因爲這是一個模板類。

Long答案:閱讀this Stackoverflow answer,其中詳細解釋了事情。

相關問題