D 相同模板参数时使用不同类型?

D 相同模板参数时使用不同类型?,d,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 O

为什么会出现此错误以及如何解决此问题?

问题在于,当前模板是用参数类型而不是参数类型实例化的

如果您将返回声明更改为:

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)
}
它将被编译,因为它是用
int
实例化的,而不是
size\u t
(即uint或ulong)


这是一个长期存在的bug,尽管他以前不喜欢它,但支持将其更改为使用参数类型。pull请求是否修复了这个问题(将在下一个DMD版本中),并链接了各种相关的bug。

因此,如果Walter不支持修复,那么他认为这不是bug,对吗?他给出了什么理由?他认为模板总是根据其参数的类型进行实例化,而其他人基本上认为模板是根据其参数的值进行实例化的(大多数模板参数都是类型)。Bug报告:澄清并添加了一个到NG帖子的链接。他的实际理由是,您可以在不破坏现有二进制文件的情况下轻松添加模板专门化。然而,“经验似乎表明这是不值得的”。@Trass3r他后来确实给出了第二个理由,但他最初的陈述都围绕着如何根据模板的参数类型实例化模板。
return Matrix!(T, cast(int)Row, cast(int)M.Col)();