2011-12-13 76 views
4
struct Matrix(T, size_t row, size_t col){ 

    alias row Row; 
    alias col Col; 

    auto opBinary(string op, M)(in M m) const if(op == "*"){ 
    static assert(Col == M.Row, "Cannot Mix Matrices Of Different Sizes."); 
    // whatever... 
    return Matrix!(T, Row, M.Col)(); 
    } 
} 


void main(){ 


    Matrix!(double, 2, 3) m1 = Matrix!(double, 2, 3)(); 
    Matrix!(double, 3, 2) m2 = Matrix!(double, 3, 2)(); 
    Matrix!(double, 2, 2) m3 = m1 * m2; // ERROR 
// Error: cannot implicitly convert expression (m1.opBinary(m2)) of type Matrix!(double,row,col) to Matrix!(double,2,2) 
} 

爲什麼錯誤,我該如何解決這個問題?相同模板參數時的不同類型?

回答

5

的問題是,目前,模板與他們參數類型,而不是他們參數類型實例化。

如果你改變了你的return語句:

return Matrix!(T, cast(int)Row, cast(int)M.Col)(); 

它將編譯,因爲它與int實例化,而不是size_t(這是UINT或ULONG)。

這是一個長期存在的錯誤,雖然他以前不喜歡它,Walter recently changed his mind支持將此更改爲使用參數類型。 Here是解決這個問題的拉取請求(它將在下一個DMD版本中),鏈接各種相關的錯誤。

+0

因此,如果沃爾特不支持修復它,那麼他不認爲這是一個錯誤,對吧?他給了什麼理由? – Arlen

+0

他爭辯說模板總是在它們的參數類型上實例化,而其他人基本上認爲它們是在它們的參數的值上實例化的(大多數模板參數都是類型的)。錯誤報告:http://d.puremagic.com/issues/show_bug.cgi?id=3467 –

+0

澄清並添加了NG帖子的鏈接。 –

相關問題