Rust编译器没有将结构视为大小

时间:2016-11-28 14:05:53

标签: rust

我试图定义一个特征如下:

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编译器ParameterSized类型?

1 个答案:

答案 0 :(得分:3)

Rust中的类型参数有implicit Sized bound,除非另有说明(通过添加?Sized绑定)。

所以Parameter结构声明是有效的:

pub struct Parameter<A: Parameterisable+Sized>(&'static str, Box<A>);

请注意,Parameter<T>的大小始终是自定义的,因为&'static strBox<A>的大小总是如此;绑定只是说T也必须大小。

错误消息支持这一点;它说Parameterisable不是Sized,而是Parameter<Parametrerisable>不是Sized

所以正确的更改是添加?Sized界限:

pub struct Parameter<A: Parameterisable+?Sized>(&'static str, Box<A>);