Вот игрушечный код, который демонстрирует проблему:
trait Foo {}
trait Boo<T> {
fn f() -> T;
}
impl<T> Boo<T> for i32
where
T: Foo,
{
fn f() -> T {
unimplemented!();
}
}
impl<'a, T> Boo<&'a T> for i32
where
T: Foo,
{
fn f() -> T {
unimplemented!();
}
}
Я хочу иметь две общие реализации trait Boo
, но он не компилируется:
error[E0119]: conflicting implementations of trait `Boo<&_>` for type `i32`:
--> src/main.rs:16:1
|
7 | / impl<T> Boo<T> for i32
8 | | where
9 | | T: Foo,
10 | | {
... |
13 | | }
14 | | }
| |_- first implementation here
15 |
16 | / impl<'a, T> Boo<&'a T> for i32
17 | | where
18 | | T: Foo,
19 | | {
... |
22 | | }
23 | | }
| |_^ conflicting implementation for `i32`
|
= note: downstream crates may implement trait `Foo` for type `&_`
Я не планирую превращать эту часть функциональности в другие ящики. Я попробовал:
- перемещение этого кода в двоичный ящик, который, очевидно, нельзя использовать из других ящиков
- переместить это в приват
mod
- маркировка черты как
pub(crate)
все безуспешно.
Есть ли способ дать компилятору намек на то, что ему должно быть все равно, что кто-нибудь реализует Foo
для какой-либо ссылки?
Может быть, мой игрушечный пример не самый лучший, так что вот реальный код.
Он используется для интеграции с частью C моей программы, поэтому немного
сложный.
impl<T: MyTrait> MyFrom<Option<T>> for *mut c_void {
fn my_from(x: Option<T>) -> Self {
match x {
Some(x) => <T>::alloc_heap_for(x),
None => ptr::null_mut(),
}
}
}
impl<'a, T: MyTrait> MyFrom<Option<&'a T>> for *mut c_void {
fn my_from(x: Option<&'a T>) -> Self {
match x {
Some(x) => x as *const T as *mut c_void,
None => ptr::null_mut(),
}
}
}