~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

Reply via email to