作者dreamboat66 (小嫩)
看板C_and_CPP
標題[問題] template特化推導遇到問題
時間Thu Sep 17 01:51:32 2015
再寫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: template class 具現化的時候就已經錯了 09/17 23:15
→ dreamboat66: 我知道錯誤原因,但一般template 不是用到才會想具現 09/18 09:25
→ dreamboat66: ,不解的是他為啥想去具現不能過的那個建構子 09/18 09:25
→ dreamboat66: 喔我了解了!所以只要不合語法在產生程式碼的階段就gg 09/18 19:17