我尝试为3D矢量的实现制作模板类。 2个文件(vec3d.h和vec3d.cpp)的相关片段为here on pastebin。
main.cpp如下:
#include "vec3d.h"
#include <iostream>
using namespace std;
int main()
{
Vec3D<double> a(1,2,3), b(2,4,5), c;
c = 2.3*b;
cout<<c._x;
return 0;
}
在使用g++ main.cpp vec3d.cpp vec3d.h
进行编译时,会发生以下错误:
In function `main':
main.cpp:(.text+0x124): undefined reference to `Vec3D<double> const operator*<double>(double, Vec3D<double> const&)'
collect2: error: ld returned 1 exit status
我已经单独列出了函数的定义和声明,但我还实例化了double
的模板。
有趣的是,c = b*2.3
不会抛出错误。有什么原因?
我也在其他几个函数上得到了相同的错误(例如&lt;&lt;,==,/ all以类似的方式声明)
我做错了什么?
[[编辑]]
我实例化了类,但是我没有实例化类外部的模板函数。显然,我也必须实例化。不知道。
更多: 请参阅this question。如果定义与具有声明的文件位于单独的文件中,则必须实例化使用模板定义的每个C ++单元,而不仅仅是类
答案 0 :(得分:1)
所需的运算符没有实例化(尽管有类实例化),它们不是类的成员。因此它们被声明但未找到定义。
您应该在标题中实现整个模板类和关联的运算符。