预期i32,找到类型参数,但类型参数是i32

时间:2017-04-17 18:54:34

标签: rust

pub struct Table<T> {
    table: Vec<Vec<T>>
}

impl<i32> Display for Table<i32>
    where i32: Display
{
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        for (index, line) in self.table.iter().enumerate() {
            write!(f, "{}:\t", index+1);

            let mut sum = 0i32;
            for task in line {
                write!(f, "{} ", task);
                sum += *task;
            }

            write!(f, " : {}\n", sum);
        }

        Result::Ok(())
    }
}

此代码会导致令人困惑的错误消息:

error[E0308]: mismatched types
  --> src/table.rs:48:24
   |
48 |                 sum += *task;
   |                        ^^^^^ expected i32, found type parameter
   |
   = note: expected type `i32` (i32)
   = note:    found type `i32` (type parameter)

而且我不知道该怎么做。

1 个答案:

答案 0 :(得分:4)

您不小心引入了名为i32的类型参数(而不是T)。我同意你的意见,编译器诊断可能会更好。

在尖括号中添加impl之后的内容,喜欢这样:

impl<i32> Display for Table<i32>

...将始终引入一个新的类型参数,就像例如impl<T>。要解决您的问题,只需从impl关键字中删除此类型参数声明:

impl Display for Table<i32> { ... }

请注意,我还删除了不再有意义的where界限。您不能将边界应用于具体类型。

相关: