2011-12-13 80 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帖子的链接。 –

相关问题