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)
}
为什么错误以及如何解决这个问题?
答案 0 :(得分:5)
问题是,目前,模板是使用参数类型实例化的,而不是参数类型。
如果您将return语句更改为:
return Matrix!(T, cast(int)Row, cast(int)M.Col)();
它会编译,因为它是用int
实例化的,而不是size_t
(这是uint或ulong)。
这是一个长期存在的错误,虽然他以前不喜欢它,但Walter recently changed his mind支持更改它以使用参数类型。 Here是修复此问题的拉取请求(它将在下一个DMD版本中),链接各种相关的错误。