Я попытался реализовать универсальную матричную функцию продукта, которая должна работать для всех примитивных типов и типов 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
ключевое слово