考虑这类守则:
trait Foo {
fn foo(&self);
}
fn consume_func(b: Box<Box<Foo>>) {
unimplemented!();
}
fn produce_func() -> Box<Box<Foo + Send>> {
unimplemented!();
}
fn main() {
let b = produce_func();
consume_func(b);
}它没有编译:
error[E0308]: mismatched types
--> src/main.rs:24:18
|
24 | consume_func(b);
| ^ expected trait `Foo`, found trait `Foo + std::marker::Send`
|
= note: expected type `std::boxed::Box<std::boxed::Box<Foo + 'static>>`
found type `std::boxed::Box<std::boxed::Box<Foo + std::marker::Send>>`双Box是Box。由于有胖指针,我无法将Box<Foo>转换为void *。
我不能更改consume_func,我宁愿不使用unsafe或其他分配。
发布于 2018-07-21 00:56:53
虽然您已经声明不能更改consume_func,但其他有类似问题的人可以更改它以接受泛型:
fn consume_func<F: Foo + ?Sized>(b: Box<Box<F>>) {
unimplemented!();
}发布于 2018-07-20 18:39:05
这里有一种方法: dereference b (“un”它对一个Box<Foo + Send>),然后立即将它封装到另一个Box<T>中,允许编译器推断正确的T (在本例中是Box<Foo>)。
consume_func(Box::new(*b));这是因为可以自动将Box<Foo + Send>强制到Box<Foo>,但是不能强迫Box<Box<Foo + Send>>到Box<Box<Foo>>。
https://stackoverflow.com/questions/51447656
复制相似问题