[問題] template特化推導遇到問題

看板C_and_CPP作者 (小嫩)時間10年前 (2015/09/17 01:51), 10年前編輯推噓2(2012)
留言14則, 4人參與, 最新討論串1/1
再寫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

09/17 10:56, , 1F
因為你的Foo(Ret(Arg::*method)(Args...)) {...}
09/17 10:56, 1F

09/17 10:56, , 2F
在Foo<void(int*, int)>時,編譯器試圖產生
09/17 10:56, 2F

09/17 10:57, , 3F
Foo(void(int::*method)(int))這種奇怪的ctor所以報錯
09/17 10:57, 3F

09/17 19:12, , 4F
是啊 但為啥明明可以有替代方案但他卻不走 ,且第二
09/17 19:12, 4F

09/17 19:12, , 5F
個例子更是極端,也還是不走
09/17 19:12, 5F

09/17 19:52, , 6F
應該是語法錯誤,沒有 int::* 這種東西。若是 SFINAE 應該
09/17 19:52, 6F

09/17 19:53, , 7F
是在推倒的情況下替換失敗才不算錯誤。
09/17 19:53, 7F

09/17 23:13, , 8F
來個更簡化的例子 你應該就會懂了
09/17 23:13, 8F

09/17 23:13, , 9F
http://ideone.com/NtCNn7 問題出在挑ctor之前
09/17 23:13, 9F

09/17 23:15, , 10F
template class 具現化的時候就已經錯了
09/17 23:15, 10F

09/18 09:25, , 11F
我知道錯誤原因,但一般template 不是用到才會想具現
09/18 09:25, 11F

09/18 09:25, , 12F
,不解的是他為啥想去具現不能過的那個建構子
09/18 09:25, 12F

09/18 10:07, , 13F
http://ideone.com/RTrIXq 直接寫就是不合法存在 不需具現
09/18 10:07, 13F

09/18 19:17, , 14F
喔我了解了!所以只要不合語法在產生程式碼的階段就gg
09/18 19:17, 14F
文章代碼(AID): #1L-QmeoM (C_and_CPP)