thanks for explanation, it all makes sense now. so I will stick to manually implement the overloading for every float type until #8075 is fixed, which is fine for now.
cheers, Rémi On Tue, Dec 3, 2013 at 11:50 PM, Eric Reed <[email protected]> wrote: > I think you're running into issue > #8075<https://github.com/mozilla/rust/issues/8075>which has to do with > generic impls conflicting with all the other impls > present. > The typechecker tries to ensure that impls are coherent, i.e. that impls > do not overlap (otherwise the compiler wouldn't know which one to use). > Unfortunately, the coherence check isn't very smart right now and if > there's a generic impl around then it assumes it could conflict with > everything (and consequently forbids any other impls). > > The specific problem here is that the coherence checker doesn't realize > that SomeData does not impl Float. Without knowing that, the checker sees > two possible impls for SomeData and rejects the code. > If you replace "impl<T: Float> SomeDataRhs for T" with "impl SomeDataRhs > for f64", then it'll work fine. You can add an impl for f32 as well (FYI > "float" is already removed in HEAD). > Unfortunately, I don't know of a good general solution that will support > all types implementing Float (i.e. what the generic impl is doing). > > > On Tue, Dec 3, 2013 at 1:09 AM, Rémi Fontan <[email protected]> wrote: > >> Hi, >> >> I think I already asked this question in the past and I'm not very sure >> what was the answer and whether it is still applicable wirh rust 0.8. >> >> I'm implementing the double dispatch method overloading such that I can >> add 2 struct together and a float to a struct. >> >> let data = SomeData{a:1.0} + 2.0; >> let data2 = SomeData{a:100.0} + data; >> >> I would like to implement the add for every type of float. I asked >> whether I could write something like this: >> >> impl<T:Float> SomeDataRhs for T { >> fn add_to(&self, lhs:&SomeData) -> SomeData { >> SomeData{a:lhs.a + cast(*self)} >> } >> } >> >> it does not compile right now with rust 0.8 >> I get error messages as follow >> >> test2.rs:39:0: 43:1 error: conflicting implementations for trait >> `SomeDataRhs` >> >> test2.rs:39 impl SomeDataRhs for SomeData { >> >> test2.rs:40 fn add_to(&self, lhs:&SomeData) -> SomeData { >> >> test2.rs:41 SomeData{a:lhs.a + self.a} >> >> test2.rs:42 } >> >> test2.rs:43 } >> >> test2.rs:33:0: 37:1 note: note conflicting implementation here >> >> test2.rs:33 impl<T:Float> SomeDataRhs for T { >> >> test2.rs:34 fn add_to(&self, lhs:&SomeData) -> SomeData { >> >> test2.rs:35 SomeData{a:lhs.a + cast(*self)} >> >> test2.rs:36 } >> >> Would you know whether what I try to do is possible. I was recommended to >> use macro for that, I don't mind to eventually go this way but I would >> rather do it the proper way if there is one. >> >> here's the full code of my test: >> extern mod std; >> use std::num::cast; >> >> >> struct SomeData { a:float } >> >> trait SomeDataRhs { >> fn add_to(&self, lhs:&SomeData) -> SomeData; >> } >> >> impl<T:SomeDataRhs> Add<T, SomeData> for SomeData { >> >> fn add(&self, rhs:&T) -> SomeData { >> rhs.add_to(self) >> } >> } >> >> // --------------- >> // implementations >> >> // impl SomeDataRhs for float { >> // fn add_to(&self, lhs:&SomeData) -> SomeData { >> // SomeData{a:lhs.a + *self} >> // } >> // } >> >> // impl SomeDataRhs for f64 { >> // fn add_to(&self, lhs:&SomeData) -> SomeData { >> // SomeData{a:lhs.a + cast(*self)} >> // } >> // } >> >> impl<T:Float> SomeDataRhs for T { >> fn add_to(&self, lhs:&SomeData) -> SomeData { >> SomeData{a:lhs.a + cast(*self)} >> } >> } >> >> impl SomeDataRhs for SomeData { >> fn add_to(&self, lhs:&SomeData) -> SomeData { >> SomeData{a:lhs.a + self.a} >> } >> } >> >> >> #[test] >> fn test_sandbox() { >> >> let mut data = SomeData{a:1.0} + 2.0; >> println!("result: {}", data.a); >> >> let mut data2 = SomeData{a:100.0} + data; >> data = data + data2; >> println!("result: {}", data.a); >> >> } >> >> >> >> cheers, >> >> Rémi >> >> >> -- >> Rémi Fontan : [email protected] >> mobile: +64 21 855 351 >> 93 Otaki Street, Miramar 6022 >> Wellington, New Zealand >> >> _______________________________________________ >> Rust-dev mailing list >> [email protected] >> https://mail.mozilla.org/listinfo/rust-dev >> >> > -- Rémi Fontan : [email protected] mobile: +64 21 855 351 93 Otaki Street, Miramar 6022 Wellington, New Zealand
_______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
