error[E0271]: type mismatch resolving `<TypeX as Trait>::Assoc == TypeY`
『関連型』が期待する型と異なっていた。
関連型まで指定されたトレイト境界があり、対象の型はそれに適合する事が期待されていた。しかし、指定されたトレイトは実装していたものの、そこから導かれる関連型が指定されたものと別の型だった。
以下では、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`