看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
diabloevagto:把傳入的參數改成(T w)如何 11/28 22:46
diabloevagto:另外你用的是c還是c++啊? 11/28 22:49
diabloevagto:你用了template T,但沒有告訴他說T是什麼型態 11/28 22:51
purincess:w看起來是int沒問題. 可是因為C++的function signature 11/28 22:57
purincess:不包含return type(不能用return type來決定要instanti- 11/28 22:57
purincess:ate哪個template-ized/overloaded function)所以你必須 11/28 22:58
purincess:寫SomeClass* list = alloc_array<SomeClass>(5); 之類 11/28 22:58
diabloevagto:可以用在return吧 http://codepad.org/g4iv4QaZ 11/28 23:08
Dannvix:沒說不能用在return啊...樓上你把purincess的推文重看一遍 11/28 23:15
purincess:樓上那是因為你argument已經有T了啊, 我不是說T不能用在 11/28 23:16
purincess:return type 我是說不能只靠return type決定 11/28 23:16
purincess:樓上 = ...好吧大家知道 11/28 23:16
purincess: 我是要說di大大XD 11/28 23:16
Dannvix:抱歉卡位XD 11/28 23:17
diabloevagto:抱歉誤會了... 11/28 23:19
diabloevagto:誤解p大的意思,突然想起來之前有一篇文討論這個問題 11/28 23:19
pnpncat:可以請問「之前有一篇文」的那一篇文怎麼找嗎XD? 11/28 23:30
pnpncat:然後p大是對的.....這樣的確就解決了 感謝萬分 11/28 23:33
purincess:不客氣~~ 11/28 23:34
diabloevagto:找不到那篇了... 11/28 23:45
mingtai1:我用ok啊..alloc_array<int>(123)可以過,你是不是編成C了 11/29 00:39
pnpncat:不是 是我之前沒加上<int>不能過 11/29 01:39
legnaleurc:呃, 是因為 sizeof 的結果是在編譯期決定, 如果沒有 11/29 02:34
legnaleurc:具現化該 function template, 編譯器不會知道 11/29 02:34
legnaleurc:sizeof T 的大小吧? 11/29 02:35
mingtai1:補充樓上..沒具現化你會發現在裡面亂寫也不會編譯錯誤 11/29 23:14