[問題] 我對 template 的理解是不是有錯誤?

看板C_and_CPP作者 (meow)時間14年前 (2011/11/28 22:29), 編輯推噓3(3023)
留言26則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Code::Blocks 問題(Question): 下列這個簡單的函式沒有問題: int *alloc_array(int w) { int *arr = (int *)malloc(w*sizeof(int)); if (arr == NULL) exit(1); return arr; } 但是若改寫成函式範本: template <typename T> T *alloc_array(int w) { T *arr = (T *)malloc(w*sizeof(T)); if (arr == NULL) exit(1); return arr; } 我以為很合理,結果使用函式時 GCC 馬上報錯: error: no matching function for call to 'alloc_array(int)' 是我對 template 的理解錯了嗎? 補充說明(Supplement): 我知道在 C++ 寫這個函式沒什麼意義 實際上這也的確是為了測試故意寫的東西 我只是很想搞懂為什麼這樣子行不通而已......@@ -- 琴劍六記 百萬字武俠長篇連載   http://gs.cathargraph.com 直接閱讀《琴劍六記》 http://gs.cathargraph.com/p/list.html -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.84.0.111

11/28 22:46, , 1F
把傳入的參數改成(T w)如何
11/28 22:46, 1F

11/28 22:49, , 2F
另外你用的是c還是c++啊?
11/28 22:49, 2F

11/28 22:51, , 3F
你用了template T,但沒有告訴他說T是什麼型態
11/28 22:51, 3F

11/28 22:57, , 4F
w看起來是int沒問題. 可是因為C++的function signature
11/28 22:57, 4F

11/28 22:57, , 5F
不包含return type(不能用return type來決定要instanti-
11/28 22:57, 5F

11/28 22:58, , 6F
ate哪個template-ized/overloaded function)所以你必須
11/28 22:58, 6F

11/28 22:58, , 7F
寫SomeClass* list = alloc_array<SomeClass>(5); 之類
11/28 22:58, 7F

11/28 23:08, , 8F
可以用在return吧 http://codepad.org/g4iv4QaZ
11/28 23:08, 8F

11/28 23:15, , 9F
沒說不能用在return啊...樓上你把purincess的推文重看一遍
11/28 23:15, 9F

11/28 23:16, , 10F
樓上那是因為你argument已經有T了啊, 我不是說T不能用在
11/28 23:16, 10F

11/28 23:16, , 11F
return type 我是說不能只靠return type決定
11/28 23:16, 11F

11/28 23:16, , 12F
樓上 = ...好吧大家知道
11/28 23:16, 12F

11/28 23:16, , 13F
我是要說di大大XD
11/28 23:16, 13F

11/28 23:17, , 14F
抱歉卡位XD
11/28 23:17, 14F

11/28 23:19, , 15F
抱歉誤會了...
11/28 23:19, 15F

11/28 23:19, , 16F
誤解p大的意思,突然想起來之前有一篇文討論這個問題
11/28 23:19, 16F

11/28 23:30, , 17F
可以請問「之前有一篇文」的那一篇文怎麼找嗎XD?
11/28 23:30, 17F

11/28 23:33, , 18F
然後p大是對的.....這樣的確就解決了 感謝萬分
11/28 23:33, 18F

11/28 23:34, , 19F
不客氣~~
11/28 23:34, 19F

11/28 23:45, , 20F
找不到那篇了...
11/28 23:45, 20F

11/29 00:39, , 21F
我用ok啊..alloc_array<int>(123)可以過,你是不是編成C了
11/29 00:39, 21F

11/29 01:39, , 22F
不是 是我之前沒加上<int>不能過
11/29 01:39, 22F

11/29 02:34, , 23F
呃, 是因為 sizeof 的結果是在編譯期決定, 如果沒有
11/29 02:34, 23F

11/29 02:34, , 24F
具現化該 function template, 編譯器不會知道
11/29 02:34, 24F

11/29 02:35, , 25F
sizeof T 的大小吧?
11/29 02:35, 25F

11/29 23:14, , 26F
補充樓上..沒具現化你會發現在裡面亂寫也不會編譯錯誤
11/29 23:14, 26F
文章代碼(AID): #1EqvhSRc (C_and_CPP)