我试图定义一个特征如下:
pub struct Parameter<A: Parameterisable>(&'static str, Box<A>);
pub trait Parameterisable {
// Some functions
}
impl Parameterisable for i32 {}
impl Parameterisable for f64 {}
pub struct ParameterCollection(Vec<Parameter<Parameterisable>>);
也就是说,参数集合是不同类型参数的混合。但是,编译会出现以下错误:
error[E0277]: the trait bound `Parameterisable + 'static: std::marker::Sized` is not satisfied
--> src/main.rs:10:32
|
10 | pub struct ParameterCollection(Vec<Parameter<Parameterisable>>);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ trait `Parameterisable + 'static: std::marker::Sized` not satisfied
|
= note: `Parameterisable + 'static` does not have a constant size known at compile-time
= note: required by `Parameter`
我从this post了解Vec
必须是Sized
,但Parameter
似乎应该调整大小(因为Box
)所以如何我是否相信Rust编译器Parameter
是Sized
类型?
答案 0 :(得分:3)
Rust中的类型参数有implicit Sized
bound,除非另有说明(通过添加?Sized
绑定)。
所以Parameter
结构声明是有效的:
pub struct Parameter<A: Parameterisable+Sized>(&'static str, Box<A>);
请注意,Parameter<T>
的大小始终是自定义的,因为&'static str
和Box<A>
的大小总是如此;绑定只是说T
也必须大小。
错误消息支持这一点;它说Parameterisable
不是Sized
,而是Parameter<Parametrerisable>
不是Sized
。
所以正确的更改是添加?Sized
界限:
pub struct Parameter<A: Parameterisable+?Sized>(&'static str, Box<A>);