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.
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>
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^