Pular para o conteúdo
TE820 · Tipos · error

Tipo não implementa um trait exigido

Uma função genérica foi chamada com um argumento de tipo que não implementa um trait exigido por um de seus bounds.

Why this fires

A generic function is called with a type argument that doesn't implement a trait required by one of its bounds.

fn sort_min<T: Ord>(a: T, b: T) -> T {
    if a > b { b } else { a }
}

struct Color { r: int, g: int, b: int }

sort_min(Color { r: 255, g: 0, b: 0 }, Color { r: 0, g: 0, b: 255 })
//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[TE820]: type `Color` does not implement trait `Ord`

Fix it

1. Implement the required trait

Add an impl <Trait> for <Type> block. For Ord, also add the comparison operators via @op:

impl Color {
    @op("<")
    fn lt(self, other: Color) -> bool { self.r < other.r }
    @op(">")
    fn gt(self, other: Color) -> bool { self.r > other.r }
}

impl Ord for Color {
    fn cmp(self, other: Color) -> int {
        if self.r < other.r { 0 - 1 } else { if self.r > other.r { 1 } else { 0 } }
    }
}

2. Use a concrete overload instead

If you only need the operation for one specific type, write a non-generic function that accepts that type directly rather than a generic with bounds.

3. Weaken the bound (if the constraint is too strict)

If the function's body only needs a subset of the trait's functionality, consider whether a less restrictive bound (or no bound at all) would suffice.

Std-trait catalogue

The following traits are recognised as built-in bounds and have primitive impls:

Trait Covers
Eq == / != on int, float, str, bool
Ord <, >, <=, >=, cmp on int, float, str
Add + on int, float, str
Sub - on int, float
Mul * on int, float
Div / on int, float
Mod % on int, float
Neg unary - on int, float
Display print-able (all primitives)
Hash hashable (all primitives)

See also

  • TE821 — operator used on an unbounded generic param.
  • TE822 — bound names an unknown trait.

Veja também

Buscar no Zolo

9 resultados

en