为什么我会收到错误"Expected type parameter, found integral variable"?



我已经熟悉了Rust泛型,但我不知道出了什么问题。

use std::collections::BTreeMap;
fn frequency<T: Ord + Clone>(vec: &Vec<T>) -> BTreeMap<T, u32> {
    let mut movie_reviews = BTreeMap::new();
    let mut vec_ = Vec::new();
    vec.push(1);
    movie_reviews
}

我不知道为什么它需要类型T:

error[E0308]: mismatched types
 --> src/lib.rs:6:14
  |
6 |     vec.push(1);
  |              ^ expected type parameter, found integral variable
  |
  = note: expected type `T`
             found type `{integer}`

我不知道为什么它需要类型T

它需要一个类型为T的值,因为您正试图将一个值推送到Vec<T>中。

问题是,你给编译器的关于T的唯一信息是它是Ord + Clone,但这两个特征都不表明1T的值。num板条箱中有一种称为One的特性,它提供了以下特性:

extern crate num; // 0.2.0
use num::One;
use std::collections::BTreeMap;
fn frequency<T>(vec: &mut Vec<T>) -> BTreeMap<T, u32> 
where
    T: Ord + Clone + One,
{
    let mut movie_reviews = BTreeMap::new();
    vec.push(T::one());
    movie_reviews
}

正如其他人所评论的,您的代码还有一两个其他问题,我不会在这里解决,因为这将修复您询问的错误。

在您的代码中,您有两个类似名称的变量vec,它们来自函数定义,是对Vec<T>(带有T: Ord+Clone(的不可变引用,而vec_Vec<_>(我在这里放了一个_,以表明您让编译器推断类型(

你不能在vec中推送1:首先你只有一个对它的免疫引用,推送需要一个可变的引用,其次vecTVec,在这种情况下,它几乎可以是实现OrdClone的所有内容,编译器不能确保你能在其中推送一个整数。

然而,您可以在vec_中推送1,编译器将推断其类型为整数的Vec

相关内容

最新更新