Thank you it compile now. I don't plan to use channel with rsfml type so it should work. I have some other issue so I can't test now.

Philippe


Le 07/02/2014 23:06, Eric Reed a écrit :
Oh, just to be clear: you should change `tr: ~Trait1' to `tr: ~Trait1: ' in the function signature of use_mon_trait and change `ptr_struct as ~Trait1' to `ptr_struct as ~Trait1: '.


On Fri, Feb 7, 2014 at 1:54 PM, Eric Reed <[email protected] <mailto:[email protected]>> wrote:

    ~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] <mailto:[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] <mailto:[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