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

发布于 2024-12-21 01:06:51 字数 622 浏览 0 评论 0原文

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)
}

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

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)
}

Why the error and how can I solve this problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

薔薇婲 2024-12-28 01:06:51

问题在于,目前模板是使用其参数类型而不是参数类型来实例化的。

如果您将 return 语句更改为:

return Matrix!(T, cast(int)Row, cast(int)M.Col)();

它将编译,因为它是用 int 实例化的,而不是 size_t (它是 uint 或 ulong)。

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

The problem is that, currently, templates are instantiated with their argument types, not their parameter types.

If you changed your return statement to:

return Matrix!(T, cast(int)Row, cast(int)M.Col)();

It will compile, because it was instantiated with int, not size_t (which is uint or ulong).

This is a long-standing bug and although he previously didn't like it, Walter recently changed his mind supporting changing this to use the parameter types. Here is the pull request fixing this issue (it will be in the next DMD release), linking various related bugs.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文