作者gigigigi (gigigigi)
看板C_and_CPP
标题[问题] template 编译错误
时间Thu Sep 22 22:47:51 2016
开发平台(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
请问这是什麽原因造成?
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 175.182.180.254
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1474555677.A.11B.html
※ 编辑: gigigigi (175.182.180.254), 09/22/2016 22:48:27
1F:推 g0010726: 所以是指一开始没把实作include到main.cpp会error吗? 09/22 23:07
2F:→ g0010726: 这是因为编译main.cpp的时候需要有template的实作, 09/22 23:07
3F:→ g0010726: 用来产生Quaternion<float>这个class吧 09/22 23:08
4F:→ gigigigi: gcc -c main.cpp 可以过~上面错误应该是link 阶段出错 09/22 23:11
※ 编辑: gigigigi (175.182.180.254), 09/22/2016 23:13:00
5F:→ gigigigi: g++ main.cpp quaternion.cpp -o main 也有把 09/22 23:13
6F:→ gigigigi: quaternion 实作编译出来但 link 出错 09/22 23:14
8F:推 legendmtg: template实作要跟定义写在同个档里 09/22 23:37
9F:→ legendmtg: 宣告 09/22 23:37
11F:→ gigigigi: 我是那闷这样拆问什麽 link 阶段会失败.. 因为这程式码 09/22 23:38
12F:→ gigigigi: 是拆成h & cpp 档案.. 09/22 23:39
13F:→ ilikekotomi: 我的理解是编译Q.cpp的时候 不会知道要编出Q<float> 09/22 23:40
14F:→ ilikekotomi: 你在.cpp加个template class Q<float>; 应该就会对了 09/22 23:41
15F:→ ilikekotomi: Q.cpp没有编译出Q<float>的实作 所以main.cpp 09/22 23:43
16F:→ ilikekotomi: 就会出现link error 09/22 23:43
17F:→ ilikekotomi: 不过一般都是全部放到.h档 stl的容器也都是这样 09/22 23:49
18F:→ gigigigi: 我大概懂了,template 是编译阶段看宣告type 去觉的产生 09/23 00:24
19F:→ gigigigi: 对应 type class ... 09/23 00:25
20F:推 QQ29: 你可以在你的quaternion.cpp 最後面写上 09/23 04:02
21F:→ QQ29: template class Quaternion<float>; 09/23 04:02
22F:→ QQ29: 应该就可以了 09/23 04:03