作者:
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:00gcc -c main.cpp 可以過~上面錯誤應該是link 階段出錯g++ main.cpp quaternion.cpp -o main 也有把quaternion 實作編譯出來但 link 出錯
作者:
gigigigi (gigigigi)
2016-09-22 23:38:00我是那悶這樣拆問什麼 link 階段會失敗.. 因為這程式碼是拆成h & cpp 檔案..
我的理解是編譯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>;應該就可以了