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

时间:2011-12-13 04:11:44

标签: 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)
}

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

1 个答案:

答案 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版本中),链接各种相关的错误。