代码之家  ›  专栏  ›  技术社区  ›  Count Zero

具有大小超特征的特征仍存在错误“std::marker::Sized is not successment”[重复]

  •  3
  • Count Zero  · 技术社区  · 6 年前

    我有以下代码:

    use std::collections::HashMap;
    
    trait T: Sized {}
    
    struct A;
    
    impl T for A {}
    
    fn main() {
        let h: HashMap<String, T>;
    }
    

    但编译器抱怨:

    error[E0277]: the trait bound `T: std::marker::Sized` is not satisfied
      --> src\main.rs:10:12
       |
    10 |     let h: HashMap<String, T>;
       |            ^^^^^^^^^^^^^^^^^^ `T` does not have a constant size known at compile-time
       |
       = help: the trait `std::marker::Sized` is not implemented for `T`
       = note: required by `std::collections::HashMap`
    
    error[E0038]: the trait `T` cannot be made into an object
      --> src\main.rs:10:12
       |
    10 |     let h: HashMap<String, T>;
       |            ^^^^^^^^^^^^^^^^^^ the trait `T` cannot be made into an object
       |
       = note: the trait cannot require that `Self : Sized`
    

    我不理解错误信息,因为我已经标记了我的特质 T Sized . 我错过什么了吗?

    1 回复  |  直到 6 年前
        1
  •  5
  •   Shepmaster Lukas Kalbertodt    6 年前

    因为我已经标记了我的特质 T Sized

    不,你没有。你说过任何类型的 实现 T 必须是 大小 . 这个 特质 它本身仍然没有大小。您需要一个trait对象(例如。 Box<T> )或者某种泛型(在这种情况下你不能这样做)。