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