[問題] template 編譯錯誤

作者: gigigigi (gigigigi)   2016-09-22 22:47:51
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
Linux/g++
// 將 template 宣告在 quaternion.h , 函數實作在 quaternion.cpp
https://gist.github.com/anonymous/00090f1598973c1c924afebf88199cc9
這樣編譯下面錯誤
g++ main.cpp quaternion.cpp -o main
/tmp/ccnOQeym.o: In function `main':
main.cpp:(.text+0x27): undefined reference to
`Quaternion<float>::Quaternion()'
main.cpp:(.text+0x38): undefined reference to
`Quaternion<float>::~Quaternion()'
collect2: error: ld returned 1 exit status
我把template 宣告跟實做都集中在 quaternion.h 可以編譯過
https://gist.github.com/anonymous/21a12dfedf6982b963d249f890977aaf
g++ main.cpp -o main
請問這是什麼原因造成?
謝謝
作者: g0010726 (Kevin)   2016-09-22 23:07:00
所以是指一開始沒把實作include到main.cpp會error嗎?這是因為編譯main.cpp的時候需要有template的實作,用來產生Quaternion<float>這個class吧
作者: gigigigi (gigigigi)   2016-09-22 23:11:00
gcc -c main.cpp 可以過~上面錯誤應該是link 階段出錯g++ main.cpp quaternion.cpp -o main 也有把quaternion 實作編譯出來但 link 出錯
作者: ilikekotomi (Young)   2016-09-22 23:36:00
https://goo.gl/GW1ma0 最簡單的方法是都放到.h檔
作者: legendmtg (CLANNAD)   2016-09-22 23:37:00
template實作要跟定義寫在同個檔裡宣告
作者: ilikekotomi (Young)   2016-09-22 23:38:00
https://goo.gl/ZaAepL 或是參考這個 兩個都有寫原因
作者: gigigigi (gigigigi)   2016-09-22 23:38:00
我是那悶這樣拆問什麼 link 階段會失敗.. 因為這程式碼是拆成h & cpp 檔案..
作者: ilikekotomi (Young)   2016-09-22 23:40:00
我的理解是編譯Q.cpp的時候 不會知道要編出Q<float>你在.cpp加個template class Q<float>; 應該就會對了Q.cpp沒有編譯出Q<float>的實作 所以main.cpp就會出現link error不過一般都是全部放到.h檔 stl的容器也都是這樣
作者: gigigigi (gigigigi)   2016-09-23 00:24:00
我大概懂了,template 是編譯階段看宣告type 去覺的產生對應 type class ...
作者: QQ29 (我愛阿蓉)   2016-09-23 04:02:00
你可以在你的quaternion.cpp 最後面寫上template class Quaternion<float>;應該就可以了

Links booklink

Contact Us: admin [ a t ] ucptt.com