C ++模板,链接器未定义引用尽管实例化?

时间:2014-10-10 19:57:03

标签: c++ templates linker undefined-reference

我尝试为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 ++单元,而不仅仅是类

1 个答案:

答案 0 :(得分:1)

所需的运算符没有实例化(尽管有类实例化),它们不是类的成员。因此它们被声明但未找到定义。

您应该在标题中实现整个模板类和关联的运算符。