我试图创建一个通用 struct ,它封装了isize
或AtomicIsize
,但当我试图为 struct 的两种可能实现实现实现一个trait时,我遇到了一个错误.我在下面创建了一个简单的例子来说明我的问题.
use std::sync::atomic::{AtomicIsize, Ordering};
use std::ops::Deref;
use std::marker::PhantomData;
pub trait Counted {
fn inc(&self, value: isize);
}
pub type PlainCounter = isize;
pub type AtomicCounter = AtomicIsize;
pub struct Counter<'a, T: 'a> {
counter: T,
phantom: PhantomData<&'a T>,
}
impl<'a, T> Counter<'a, T>
where T: Deref<Target = PlainCounter>
{
pub fn new(counter: T) -> Self {
Counter {
counter: counter,
phantom: PhantomData,
}
}
}
impl<'a, T> Counted for Counter<'a, T>
where T: Deref<Target = PlainCounter>
{
fn inc(&self, value: isize) {
self.counter += 1;
}
}
impl<'a, T> Counter<'a, T>
where T: Deref<Target = AtomicCounter>
{
pub fn new(counter: T) -> Self {
Counter {
counter: counter,
phantom: PhantomData,
}
}
}
impl<'a, T> Counted for Counter<'a, T>
where T: Deref<Target = AtomicCounter>
{
fn inc(&self, value: isize) {
self.counter.fetch_add(value, Ordering::SeqCst);
}
}
我得到的错误是编译器找到了conflicting implementations of trait `Counted` for type `Counter<'_, _>`
.编译器似乎无法确定实现是针对两种不同的类型T
,即T: Deref<Target = PlainCounter>
和T: Deref<Target = AtomicCounter>
.是否有一种方法可以向编译器提供额外的信息,以便它能够区分这两种情况,还是我完全走错了路?