2013-08-07 75 views

回答

1

operator T()返回與x,y,z初始化爲T列表。這意味着DoSomething的過載在需要2個向量或需要向量的過程和double*之間不明確。

因此,如果您在調用站點將您的第二個參數強制轉換爲您想要的類型,您將明確告訴編譯器需要採取的重載。

std::enable_if基本上消除了使用三個double s不可構造的過載,這意味着它消除了模糊性,因此它編譯。

你的載體可以與三個double s構造。

Vector(double x, double y, double z) 
+0

數組在哪裏?難道它不直接選擇一個轉換嗎''double *'(如果實例化會失敗,但沒有被實例化,因爲重載解析早已出錯)? – hvd

+1

數組?呵呵....? –

+0

你編輯了你的答案腐敗,並把它放回去。你不應該把它放回:)只是嘗試刪除其他超載,並強制隱式轉換爲'double *':它不會工作。轉換爲'double *'是不可能的。有和沒有'enable_if'之間唯一的區別是什麼時候被檢測到。 – hvd

1

沒有enable_if,您的轉換運算符對每種類型都存在。如果嘗試實例化不能從{x, y, z}構造的類型的轉換運算符,但不會改變運算符存在的事實,則會出現錯誤。因爲它存在,所以該類型被認爲可轉換爲double *,並且重載解析不能選擇最佳匹配。

相關問題