You might be missing a type parameter or trait bound

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=44dfb80f36f6ad6242fb8c5cf3b6dfa6

There's no guarantee that, if b1 and b2 are of type B and B: Add, then b1 + b2 will also be of type B. Check documentation for the trait for more info.

For future reference, the solution is to change B: Add to B: Add<Output = B>.

I've opened a PR to make rustc suggest this going forward.

2 Likes

This is now in nightly:

error[E0308]: mismatched types
  --> src/main.rs:12:8
   |
5  | impl<B> Add for A<B>
   |      - this type parameter
...
12 |         Self(self.0 + rhs.0)
   |              ^^^^^^^^^^^^^^ expected type parameter `B`, found associated type
   |
   = note: expected type parameter `B`
             found associated type `<B as std::ops::Add>::Output`
help: consider further restricting this bound
   |
7  |     B: Add + std::ops::Add<Output = B>
   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
1 Like