2014-10-10 55 views
-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++單元都必須實例化,如果定義與聲明中的文件不在同一個文件中,而不僅僅是類

+0

您應該向我們展示'Vec3D'類以及其明確的實例。 – 0x499602D2 2014-10-10 19:59:49

+0

@πάνταῥεῖ「我已經分別定義了函數的定義和聲明,但是我也已經將模板實例化爲double。」 - 我認爲他意識到將聲明和定義分開的問題,但他說他將模板實例化爲雙。我認爲,因爲錯誤顯示'operator *'是一個函數模板,所以他顯式實例化了*成員函數*'operator *',而不是*全局函數*(如圖所示,在左邊顯示double在錯誤中)。 – 0x499602D2 2014-10-10 20:05:31

+0

您是否記得明確實例化全局運算符函數? '模板Vec3D const operator *(double,Vec3D const&)' – 0x499602D2 2014-10-10 20:16:17

回答

1

所需的操作符沒有實例化(儘管類實例化),他們不是這個班的成員。因此他們被宣佈,但沒有找到定義。

您應該在頭中實現整個模板類和關聯的運算符。