[问题] 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