使用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 `::

猜你喜欢

转载自blog.csdn.net/Blateyang/article/details/80960775
今日推荐