rust - 我如何要求对泛型类型的引用实现特征?
问题描述
我试图实现一个通用的矩阵乘积函数,它应该适用于所有原始类型和板条箱中的BigInt
/BigUint
类型num_bigint
:
extern crate num_bigint;
extern crate num_traits;
use num_traits::identities::Zero;
use std::ops::{AddAssign, Mul};
#[derive(Debug, Clone)]
struct Matrix<T> {
n: usize,
m: usize,
data: Vec<Vec<T>>,
}
fn m_prd<T>(a: &Matrix<T>, b: &Matrix<T>) -> Matrix<T>
where
T: Clone + AddAssign + Mul<Output = T> + Zero,
{
let n = a.n;
let p = b.n;
let m = b.m;
let mut c = Matrix {
n: n,
m: m,
data: vec![vec![T::zero(); m]; n],
};
for i in 0..n {
for j in 0..m {
for k in 0..p {
c.data[i][j] += &a.data[i][k] * &b.data[k][j];
}
}
}
c
}
fn main() {}
我收到以下错误消息:
error[E0369]: binary operation `*` cannot be applied to type `&T`
--> src/main.rs:29:33
|
29 | c.data[i][j] += &a.data[i][k] * &b.data[k][j];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: an implementation of `std::ops::Mul` might be missing for `&T`
在这种情况下如何实现该功能&T
?
Shepmaster 认为这个问题是重复的,但似乎是由于运算符 (AddAssign
或Mul
) 应用于参考 ( ) 需要在关键字 &T
后单独声明where
解决方案
推荐阅读
- java - 如何使用 volley 将 FCM 通知从一台设备发送到多台设备(订阅主题)
- android - MotionLayout 中的浮动操作按钮(FAB),.show() 不起作用,.hide() 工作不正确
- css - 是否可以在 Vue.js 的不同“页面”上设置不同的菜单样式?
- matlab - 您如何交叉关联音频文件以查看样本是否与原始文件匹配?
- sql-server - VB Net - SQL - 比较文本框的值和 SQL 值
- mysql - 列的页面溢出(InnoDB)如何在 MySQL 中工作?
- laravel - Laravel belongsTo() 为结果中的第一个关系返回 null
- hyperlink - MS Edge PDF 查看器是否会去除适用于 Windows 10 版本 1909 的 IE 中的 PDF 链接?
- java - 自 Andriod 11 以来应用程序活动上方的黑色死区
- python - 将多个值包装在单个 JSON 中并存储在模型中 - Django