使用Dev C++編譯C++工程時出現undefined reference 錯誤
阿新 • • 發佈:2019-01-14
我的工程包含三個檔案,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 `::