具有大小的超级特征的特征仍然有错误“std :: marker :: Sized不满意”[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有大小的超级特征的特征仍然有错误“std :: marker :: Sized不满意”[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我有以下代码:

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
  --> srcmain.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
  --> srcmain.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。我错过了什么吗?

答案

因为我把我的特质T标记为Sized

不,你没有。你已经说过任何实现T的类型都必须是Sized。特质本身仍未实现。你需要一个特质对象(例如Box<T>)或某种泛型(在这种情况下你不能做)。

以上是关于具有大小的超级特征的特征仍然有错误“std :: marker :: Sized不满意”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

具有特征的 C++ 类型擦除

将特征 C++ 块表达式推回 std::vector

来自 GCC 的未定义参考错误使用带有 std::vector 和特征矩阵的模板?

如何使用具有关联类型的非静态特征对象?

python离散特征编码

具有指向成员函数的指针的 SFINAE 类型特征失败