c++ - 关于 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
我该如何解决这个问题,为什么会这样?
解决方案
模板类必须在标头中专门定义。它们不能单独编译。
原因是编译器只能为该模板的特定实例生成机器代码。该Vector.cpp
文件基本上编译为空,它只是一堆其他未使用的定义。
由于这些定义没有任何意义,因此它们没有在 内实例化Vector.cpp
,因此它们实际上被忽略了。当需要编译时,VectorDemo.cpp
它们会丢失,因此会出现链接器错误。
推荐阅读
- microsoft-graph-api - 识别处于预配状态的 Teams 站点
- visual-studio - Find the secure name (sn.exe) container name for Visual Studio
- java - Kafka 流,自定义键特定时间窗口
- python - 如何从 DOM 获取没有标签的元素文本
- reactjs - Sanitize.css 覆盖材料 ui css
- autodesk-forge - 使用 Autodesk Forge Viewer Geolocation Extension 的结果不正确
- python-3.x - 根据日期熊猫计算
- c++ - 带有初始化程序的 while 语句
- laravel - 如何在laravel中的类别下验证唯一字段的唯一性
- c - c语言中的web cgi,提供二进制图像文件