我的工程包含三个文件,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 `::