相同模板参数时的不同类型?

Arl*_*len 4 d

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)
}
Run Code Online (Sandbox Code Playgroud)

为什么错误以及如何解决这个问题?

jA_*_*cOp 5

问题是,目前,模板是使用它们的参数类型实例化的,而不是它们的参数类型.

如果您将return语句更改为:

return Matrix!(T, cast(int)Row, cast(int)M.Col)();
Run Code Online (Sandbox Code Playgroud)

它将编译,因为它实例化了int,而不是size_t(这是uint或ulong).

这是一个长期存在的错误,虽然他以前不喜欢它,但沃尔特最近改变了主意,支持改变它以使用参数类型.是解决此问题的拉取请求(它将在下一个DMD版本中),链接各种相关的错误.