error[E0271]: type mismatch resolving `<TypeX as Trait>::Assoc == TypeY`

関連型』が期待する型と異なっていた。

原因

トレイト境界が関連型まで指定されており、対象の型はそれに適合する事が期待されていた。しかし、対象の型は指定されたトレイトについては実装していたものの、トレイトの関連型として導かれるのは指定された型とは異なる型だった。

パターン

パターン A

基本形

単純に関連型が一致しないパターン。

サンプル

以下では、func に渡される u32 型が引数型 T の境界に適合せずエラーになる。なぜなら、u32 型は Unsigned トレイトを実装するが、Unsigned::Signed として導かれる型は i64 ではなく i32 になる。


fn main() {
    func(1_u32);
}

fn func<T>(val: T) where T: Unsigned<Signed=i64> {
    println!("{}", val.negative());
}

trait Unsigned {
    type Signed;
    fn negative(&self) -> Self::Signed;
}

impl Unsigned for u32 {
    type Signed = i32;
    fn negative(&self) -> Self::Signed {
        -(*self as i32)
    }
}

error[E0271]: type mismatch resolving `<u32 as Unsigned>::Signed == i64`
  --> src\main.rs:2:10
   |
2  |     func(1_u32);
   |     ---- ^^^^^ type mismatch resolving `<u32 as Unsigned>::Signed == i64`
   |     |
   |     required by a bound introduced by this call
   |
note: expected this to be `i64`
  --> src\main.rs:15:19
   |
15 |     type Signed = i32;
   |                   ^^^
note: required by a bound in `func`
  --> src\main.rs:5:38
   |
5  | fn func<T>(val: T) where T: Unsigned<Signed=i64> {
   |                                      ^^^^^^^^^^ required by this bound in `func`

パターン B

Comming soon?

、次期トレイトソルバーとして期待される next-solver が出力しているエラー。これは元は E0308 として出力されていた。詳しくは、『E0308 - HRTB を期待する型推論』を参照されたい。