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)();