-2
我試圖製作一個3D矢量實現的模板類。 2個文件(vec3d.h和vec3d.cpp)的相關片段是here on pastebin。儘管實例化C++模板,鏈接器未定義的引用?
的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
不會引發錯誤。有什麼理由? 我也得到其他一些功能相同的錯誤(如< <,== /所有以類似的方式聲明)
我在做什麼錯?
[[編輯]]
我實例化的類,作爲應,但是我沒有實例化它們是類的外部存在的模板函數。顯然,我也必須實例化。不知道。
更多: 請參閱this question。每個使用模板定義的C++單元都必須實例化,如果定義與聲明中的文件不在同一個文件中,而不僅僅是類
您應該向我們展示'Vec3D'類以及其明確的實例。 – 0x499602D2 2014-10-10 19:59:49
@πάνταῥεῖ「我已經分別定義了函數的定義和聲明,但是我也已經將模板實例化爲double。」 - 我認爲他意識到將聲明和定義分開的問題,但他說他將模板實例化爲雙。我認爲,因爲錯誤顯示'operator *'是一個函數模板,所以他顯式實例化了*成員函數*'operator *',而不是*全局函數*(如圖所示,在左邊顯示double在錯誤中)。 – 0x499602D2 2014-10-10 20:05:31
您是否記得明確實例化全局運算符函數? '模板Vec3D const operator *(double,Vec3D const&)' –
0x499602D2
2014-10-10 20:16:17