Получение Copy
является особенным в этом случае, потому что Matrix
является общим:
#[repr(C)]
#[derive(Hash, Clone, Copy)]
pub struct Matrix<N: Scalar, R: Dim, C: Dim, S> {
/// The data storage that contains all the matrix components and informations about its number
/// of rows and column (if needed).
pub data: S,
_phantoms: PhantomData<(N, R, C)>,
}
Маркер Copy
реализуется, только если N
, R
, C
иS
также Copy
.
Действительно, вы можете увидеть эту строку на странице документации Matrix
:
impl<N: Copy + Scalar, R: Copy + Dim, C: Copy + Dim, S: Copy> Copy for Matrix<N, R, C, S>
В качестве более простого примера, этот код прекрасно компилируется:
#[derive(Clone, Copy)]
struct DummyWrapper<T>(T);
fn main() {
}
Но, конечно, вы можете копировать DummyWrapper
, только если T
тоже можно копировать:
#[derive(Clone, Copy)]
struct DummyWrapper<T>(T);
fn consume<T>(_t: T) {}
fn main() {
// Ok
let a = DummyWrapper(42);
consume(a);
consume(a);
// Error: move occurs because `a` has type `DummyWrapper<std::string::String>`,
// which does not implement the `Copy` trait
let a = DummyWrapper(String::from("test"));
consume(a);
consume(a);
}
Чтобы сделать вашу структуру копируемой, я только догадываюсь,но вы должны добавить следующие границы:
N: Copy, D: Copy