看板 C_and_CPP 關於我們 聯絡資訊
再寫template特化遇到一個無法克服的盲點 請各位告訴我哪裡觀念有問題 http://ideone.com/vZXVDQ 我程式碼中 註解掉的那一行始終不如預期的去走該走的建構子 原因我無法推敲出來原因... 也找不到辦法解決這個點 請問他這樣是有什麼規則可言嗎? 因為我1, 2兩個註解都可以成功區分.... http://ideone.com/mwzTpI 這是簡化一下遇到的問題 我故意讓兩個建構子都必須要作推導 (在同一個起跑點的概念...也許compiler會以不推導的先判別一些東西) 我預期他會直接走第一個建構子 原因是他吃兩個參數 可是compiler卻不管怎樣都會出現這error 他一直想要推導出第二個建構子 可是當然是不合語法.... 以上兩段程式碼是哪裡觀念有盲點呢? 我主要是想要特化一個版本 可以完全區別 pointer to member function 和 其他callble物件 可是始終被這問題卡很久 謝謝 但始終無法克服這問題 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.218.186.119 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1442425896.A.C96.html ※ 編輯: dreamboat66 (180.218.186.119), 09/17/2015 01:54:04
kevingwn: 因為你的Foo(Ret(Arg::*method)(Args...)) {...} 09/17 10:56
kevingwn: 在Foo<void(int*, int)>時,編譯器試圖產生 09/17 10:56
kevingwn: Foo(void(int::*method)(int))這種奇怪的ctor所以報錯 09/17 10:57
dreamboat66: 是啊 但為啥明明可以有替代方案但他卻不走 ,且第二 09/17 19:12
dreamboat66: 個例子更是極端,也還是不走 09/17 19:12
firose: 應該是語法錯誤,沒有 int::* 這種東西。若是 SFINAE 應該 09/17 19:52
firose: 是在推倒的情況下替換失敗才不算錯誤。 09/17 19:53
AstralBrain: 來個更簡化的例子 你應該就會懂了 09/17 23:13
AstralBrain: http://ideone.com/NtCNn7 問題出在挑ctor之前 09/17 23:13
AstralBrain: template class 具現化的時候就已經錯了 09/17 23:15
dreamboat66: 我知道錯誤原因,但一般template 不是用到才會想具現 09/18 09:25
dreamboat66: ,不解的是他為啥想去具現不能過的那個建構子 09/18 09:25
firose: http://ideone.com/RTrIXq 直接寫就是不合法存在 不需具現 09/18 10:07
dreamboat66: 喔我了解了!所以只要不合語法在產生程式碼的階段就gg 09/18 19:17