Как я могу требовать, чтобы ссылка на универсальный тип реализовывала черту? - PullRequest
0 голосов
/ 30 мая 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...