~Trait is really sugar for ~Trait: Send, so you're putting an implicit Send bound wherever you use ~Trait. A type meets the Send bound if it's safe to send over channels (which really means that it contains no aliasable data or references [alternatively, it owns all of its parts]). Rc can never meet the Send bound (b/c of aliasability), so what you need to do is get rid of the Send bound (not a problem since you're not actually using it). You can do this by replacing ~Trait with ~Trait: (notice the semicolon! you're specifying that the bound list for ~Trait is empty). I just tried this with your example and it compiles afterwards.
On Fri, Feb 7, 2014 at 12:50 PM, Philippe Delrieu <[email protected]>wrote: > Hello, > > I use sfml lib that contains type that has Rc<RefCell<>> fields. > I use them in a struct that implements some trait. I have some function > that take trait as argument. > When I compile I have the error : error: cannot pack type `~PtrStruct`, > which does not fulfill `Send`, as a trait bounded by Send > > I do some test code to be more clear: > extern mod rsfml; > > use std::ptr; > use std::rc::Rc; > use std::cell::RefCell; > > pub trait Trait1 { > fn todo(&self); > } > > pub struct PtrStruct { > this : Rc<RefCell<~str>> > } > > impl Trait1 for PtrStruct { > fn todo(&self) {} > } > > > pub trait MonTrait { > fn use_mon_trait(&self, tr: ~Trait1); > } > > pub struct UseMonTrait; > > impl MonTrait for UseMonTrait { > fn use_mon_trait(&self, tr: ~Trait1) { > tr.todo(); > } > } > > #[main] > fn main() { > let ptr_struct = ~PtrStruct{ this : Rc::new(RefCell::new(~"toto"))}; > let use_ptr = UseMonTrait; > use_ptr.use_mon_trait(ptr_struct as ~Trait1); > } > > 36:34 error: cannot pack type `~PtrStruct`, which does not fulfill `Send`, > as a trait bounded by Send > use_ptr.use_mon_trait(ptr_struct); > ^~~~~~~~~~ > > If I replace Rc<RefCell<~str>> with ~str it works. > > Any idea to make Rc<RefCell<>> compatible with Send trait. > > Philippe Delrieu > > _______________________________________________ > Rust-dev mailing list > [email protected] > https://mail.mozilla.org/listinfo/rust-dev >
_______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
