[問題] template 放在 .cpp 裡造成連結錯誤

看板C_and_CPP作者 (....)時間12年前 (2013/08/14 13:44), 編輯推噓-2(1318)
留言22則, 9人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) vc 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) none 問題(Question): A.h http://codepad.org/jySlti0c A.cpp http://codepad.org/5IRCfnjn hello.cpp http://codepad.org/qIWGTyXy 為什麼一直出現連結錯誤 錯誤 1 error LNK2019: 無法解析的外部符號 "public: void __thiscall A<int>::print(void)" (?print@?$A@H@@QAEXXZ) 在函式 _main 中被參考 hello.obj hello 錯誤 2 fatal error LNK1120: 1 個無法解析的外部符號 G:\Cpp\hello\Debug\hello.exe hello 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) A.h http://codepad.org/jySlti0c A.cpp http://codepad.org/5IRCfnjn hello.cpp http://codepad.org/qIWGTyXy 補充說明(Supplement): -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.38.233.222

08/14 14:47, , 1F
把a.cpp的實作移到a.h看看
08/14 14:47, 1F

08/14 14:52, , 2F
這樣做可能不好吧...C++的傳統就是表頭和實作分離不是嗎
08/14 14:52, 2F

08/14 15:04, , 3F
對template而言,沒有你所謂的這個傳統。
08/14 15:04, 3F

08/14 15:09, , 4F
直到今年中主要compiler還並不支援這個「傳統」。
08/14 15:09, 4F

08/14 15:10, , 5F
(說「今年中」是客氣,可以直接改成「目前為止」。)
08/14 15:10, 5F

08/14 15:13, , 6F
template是在編譯期展開成有*用到*的多重版本,所以
08/14 15:13, 6F

08/14 15:14, , 7F
相關討論 : http://0rz.tw/HIIUG
08/14 15:14, 7F

08/14 15:14, , 8F
所以編譯main時必須引入template的*src*;不然無從判
08/14 15:14, 8F

08/14 15:15, , 9F
斷是否用到
08/14 15:15, 9F

08/14 15:33, , 10F
"實做分離"是分離別人用不到的實做
08/14 15:33, 10F

08/14 15:33, , 11F
很不幸的用template必須知道實做細節
08/14 15:33, 11F

08/15 00:22, , 12F
還有問問題這樣問的
08/15 00:22, 12F

08/15 00:24, , 13F
"template不是程式碼" 念一百遍, 要給完角括號參數才
08/15 00:24, 13F

08/15 00:25, , 14F
能具現化出"程式碼", 你可以在.cpp內具現化需要用到的
08/15 00:25, 14F

08/15 00:26, , 15F
實體, .h留宣告就好. 我關鍵字已經打了自己google
08/15 00:26, 15F

08/15 16:52, , 16F
多年以前我曾經為了這個去買Comeau C++,但真的沒必要
08/15 16:52, 16F

08/15 16:54, , 17F
實際上template還有其他未被主要compiler正確實作的feature
08/15 16:54, 17F

08/15 16:55, , 18F
如果是學術研究還好,工作上不建議花這種時間精力
08/15 16:55, 18F

08/15 16:58, , 19F
簡單易懂的程式碼才是王道
08/15 16:58, 19F

08/15 22:53, , 20F
有必要看一章問一篇嗎? 是不會 google?
08/15 22:53, 20F

08/16 00:41, , 21F
你可以在A.h最下面加上一行#include"A.cpp"
08/16 00:41, 21F

08/16 00:42, , 22F
至於export,現在幾乎沒有編譯器支援他
08/16 00:42, 22F
文章代碼(AID): #1I2nakT4 (C_and_CPP)