编译以下代码,将发生如下错误。
error[E0277]: the trait bound `dyn T: std::clone::Clone` is not satisfied
--> src/main.rs:3:21
请帮助我修复代码。
trait T:{}
#[derive(Clone)]
struct S1{val:isize,nd:Box<dyn T>,}
#[derive(Clone)]
struct S2{val:isize,}
impl T for S1{}
impl T for S2{}
fn main(){
let x2=S2{val:2};
let x1=S1{val:1,nd:Box::new(x2)};
let x1=x1.clone();
}
答案 0 :(得分:1)
编译器告诉您Clone
不满足特征Box<dyn T>
。
要解决此问题,您可以做的是:
trait T: Clone {}
这将强制所有T
的实现者也实现Clone
。
这已解决一件事,但是执行此操作后,您将看到一个新错误,不允许您构造特征对象。
error[E0038]: the trait `T` cannot be made into an object
--> /Users/mihir/fquicktest/data/user_data/instances/so_rust_q.rs:3:21
|
3 | struct S1{val:isize,nd:Box<dyn T>,}
| ^^^^^^^^^^^^^ the trait `T` cannot be made into an object
|
= note: the trait cannot require that `Self : Sized`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0038`.
我真的建议您阅读rustc --explain E0038
。它的文档记录非常好,将向您说明无法创建特征对象的情况。
还有,要解决此问题,可以使用dyn-clone。
更新代码:
use dyn_clone::DynClone;
trait T: DynClone {}
dyn_clone::clone_trait_object!(T);
#[derive(Clone)]
struct S1 {
val: isize,
nd: Box<dyn T>,
}
#[derive(Clone)]
struct S2 {
val: isize,
}
impl T for S1 {}
impl T for S2 {}
fn main() {
let x2 = S2 { val: 2 };
let x1 = S1 {
val: 1,
nd: Box::new(x2),
};
let x1 = x1.clone();
}
dyn_clone
docs上有一些示例可能会有所帮助。