首页 > 解决方案 > 关于 g++ 链接器错误“未定义的引用”

问题描述

我是 C++ 新手,为了练习,我编写了自己的向量类。头文件 Vector.h 是

#ifndef VECTOR_H_INCLUDED
#define VECTOR_H_INCLUDED

#include <cstddef>
#include <memory>

template <class T> class Vector {

    public:
        Vector();
       ~Vector();

    // code

};

#endif

对应的源文件 Vector.cpp 是

#include "Vector.h"

template <class T> Vector<T>::Vector() 
{ 
    // code 
}

template <class T> Vector<T>::~Vector() 
{ 
    // code 
}

// code

测试文件 VectorDemo.cpp 是

#include "Vector.h"

int main() 
{
    Vector<int> v;
    return 0;
}

在 Bash 我输入

g++ -c Vector.cpp VectorDemo.cpp
g++ -o VectorDemo Vector.o VectorDemo.o

并得到以下错误

VectorDemo.o: In function `main':
VectorDemo.cpp:(.text+0x27): undefined reference to `Vector<int>::Vector()'
VectorDemo.cpp:(.text+0x38): undefined reference to `Vector<int>::~Vector()'
collect2: error: ld returned 1 exit status

我该如何解决这个问题,为什么会这样?

标签: c++linkerlinker-errors

解决方案


模板类必须在标头中专门定义。它们不能单独编译。

原因是编译器只能为该模板的特定实例生成机器代码。该Vector.cpp文件基本上编译为空,它只是一堆其他未使用的定义。

由于这些定义没有任何意义,因此它们没有在 内实例化Vector.cpp,因此它们实际上被忽略了。当需要编译时,VectorDemo.cpp它们会丢失,因此会出现链接器错误。


推荐阅读