1. 程式人生 > >使用Dev C++編譯C++工程時出現undefined reference 錯誤

使用Dev C++編譯C++工程時出現undefined reference 錯誤

我的工程包含三個檔案,Vector模板類的宣告檔案Vector.h和定義檔案Vector.cpp以及主函式main.cpp,具體程式碼如下:

// Vector.h
#ifndef VECTOR_H
#define VECTOR_H 
#include <iostream> 
typedef int Rank;
#define DEFAULT_CAPACITY 3
using std::cout;

// Vector模板類 
template <typename T> class Vector{
protected:
    Rank _size, _capacity; //規模、容量 
T *_elem; //資料區 void copyFrom(T const* A, Rank lo, Rank hi); //複製陣列區間A[lo, hi) public: Vector(int c = DEFAULT_CAPACITY, int s = 0, T v=0) //容量c,規模為s,所有元素初始為v { _elem = new T[_capacity = c]; for(_size = 0; _size < s; _elem[_size++] = v); } Vector(T const* A, Rank lo, Rank hi) { copyFrom(A, lo, hi);} //陣列區間複製
Vector(T const* A, Rank n) { copyFrom(A, 0, n);} //陣列整體複製 Vector(Vector<T> const& V, Rank lo, Rank hi) { copyFrom(V._elem, lo, hi);} //向量區間複製 Vector(Vector<T> const& V, Rank n) { copyFrom(V._elem, 0, n);} //向量整體複製 //解構函式 ~Vector() { delete [] _elem;} void print() { for
(Rank i=0; i<_size; ++i) cout<<_elem[i]<<" "; } }; //template <typename T> //void Vector<T>::copyFrom(T const *A, Rank lo, Rank hi) //{ //以陣列區間A[lo, hi)為藍本複製向量 // _elem = new T[2*(hi-lo)]; //分配2倍於(hi-lo)的空間 // _size = 0; //規模清零 // while(lo<hi) // { // _elem[_size++] = A[lo++]; //// cout<<_size<<" "<<lo<<std::endl; // } //} #endif //VECTOR_H // Vector.cpp #include "Vector.h" template <typename T> void Vector<T>::copyFrom(T const *A, Rank lo, Rank hi) { //以陣列區間A[lo, hi)為藍本複製向量 _elem = new T[2*(hi-lo)]; //分配2倍於(hi-lo)的空間 _size = 0; //規模清零 while(lo<hi) _elem[_size++] = A[lo++]; } //main.cpp #include <iostream> #include "Vector.h" using namespace std; int main() { int arr[3]={1,2,3}; Vector<int> v(arr, 3); v.print(); return 0; }

在編譯工程的時候會報錯“…Vector.h undefined reference to `Vector::copyFrom(int const*, int, int)’”,該語句表明編譯器找不到copyFrom函式的定義。

一開始始終想不通,明明有copyFrom函式的實現,為什麼編譯器找不到,自己嘗試把copyFrom函式的定義放到標頭檔案中就不會報錯了,後來通過上網查詢才知道原來是模板類的原因。對於普通的類,即使宣告和定義分別位於.h和.cpp檔案,在main.cpp中只需要把類的標頭檔案用#include命令包含就行了;但對於模板類,由於模板類的實現不是函式,因此cpp執行檔案不能單獨編譯。也就是說,編譯器不能通過h標頭檔案來找到並且編譯對應的cpp執行檔案。

解決辦法有兩種:
1. 把模板類的定義也放在標頭檔案中,見程式碼中Vector.h部分被註釋的程式碼段
2. 如果實在想把模板類的宣告和定義(實現)分開,則需要在main.cpp中用#include命令將模板類的cpp檔案包含進來

此文只是針對由模板類引發的undefined reference 錯誤,其它原因也有可能引發該錯誤,可以看看參考資料2。
另外,貼一個Dev C++使用簡介,包括如何建立工程和除錯工程等,個人覺得蠻實用的。

參考資料:
1. CSDN論壇
2. 編譯C++程式遇到錯誤:undefined reference to `::