即使关联类型不同,特征实现也会发生冲突

2024-02-15

我正在尝试创建一个通用结构来包装isize or an AtomicIsize,但是当我尝试为该结构的两种可能实现实现一个特征时,我遇到了错误。我创建了一个最小的示例来演示我的问题如下。

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> and T: Deref<Target = AtomicCounter>。也许有一种方法可以向编译器提供附加信息,以便它可以区分这两种情况,或者我完全走错了路?


您可以通过定义执行实际工作的第二个特征来实现此模式,并为其实现(Counter<'a, T>, <T as Deref>::Target),并且有Counter特质调用该实现。

我认为这不是很清楚,但我认为一个例子可以很好地说明。为了清楚起见,使用 Shepmaster 的简短示例,我们将从以下开始:

use std::ops::Deref;

trait Foo {}

impl<T> Foo for T
    where T: Deref<Target = u8>
{}

impl<T> Foo for T
    where T: Deref<Target = bool>
{}

fn main() {}

to this:

use std::ops::Deref;

trait Foo {}
trait InnerFoo {}

impl<T> Foo for T
    where T: Deref,
          (T, <T as Deref>::Target): InnerFoo
{}

impl<T> InnerFoo for (T, u8)
{}

impl<T> InnerFoo for (T, bool)
{}

fn main() {}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使关联类型不同,特征实现也会发生冲突 的相关文章

随机推荐

  • 使用 git lfs 存储的 MP4 文件无法在 Github Pages 中播放

    我的存储库中有一个 mp4 文件 用 git lfs 存储 我希望能够在我的网站上播放 当我打开带有 github 页面的网站时 视频不可见 有什么想法吗 原始答案 2019 您可以查看中提出的解决方法git lfs git lfs 问题
  • 如何在 Java 中快速检索目录列表?

    假设有一个非常简单的程序 列出给定目录的所有子目录 听起来很简单吗 除了在 Java 中列出所有子目录的唯一方法是使用文件名过滤器 http java sun com javase 6 docs api java io FilenameFi
  • php-fpm 和 nginx 会话问题

    过去一周左右我一直遇到这个问题 我一直在开发一个严重依赖会话的 PHP 项目 由于某种原因 过去几天我们在保存会话方面遇到了麻烦 知道为什么吗 这是错误 Warning Unknown open tmp sess mmd0ru5pl2h2h
  • Kendo 数据源参数映射

    我是剑道新手 我在模型绑定方面遇到问题 当我用 firebug 调试时 它显示options models 是不明确的 因此 parrameterMap 中的 if 条件始终为 false 并且网格不会填充数据 但是当我删除 parrame
  • Scientific Linux 上的 Grail(网络浏览器)安装

    我不确定 Grail 浏览器现在是否是一个好的选择 但是我想尝试一下 因为我在 Firefox Fermi 上运行图形时遇到一些问题 接下来是我尝试 grail 0 6 tgz 后获得的结果 python grail py Tracebac
  • 是否有本地 Google App Engine 数据查看器?

    我想离线使用谷歌的在线GAE数据查看器 是否有一些 python 代码可以显示我所有的本地数据甚至模式 是的 去http localhost 8000 ah admin http localhost 8000 ah admin 假设您正在使
  • 如何从服务器端 Blazor Net Core 5.0 调用 API 控制器操作?

    我创建了一个标准 Blazor 服务器应用程序 然后我添加了一个具有读 写操作的 API 控制器 现在我想从索引页调用一个操作 但它不起作用 应用程序运行没有错误 但没有返回预期的结果 状态 等待激活 方法 空 结果 尚未计算 我在控制器操
  • OpenNLP:类文件版本 55.0 错误,应为 52.0

    我在 IntelliJ IDEA 版本 17 0 6 中使用 Open NLP 版本 apache opennlp 2 2 0 库 但收到以下消息 java cannot access opennlp tools namefind Name
  • Castle ActiveRecord:映射到 C# 中的类中的 IUserType

    对于我当前的项目 我在 C 中使用 Castle 的 ActiveRecord 对于我的一个表 我确实需要使用自定义类型类 处理愚蠢的时间到时间跨度转换 为了保持我的代码干净 我喜欢定义派生自的类IUserType在对象映射类内 但我找不到
  • 如果 Moshi 中的值不匹配,如何回退到枚举

    我有一个枚举类 如果值与其中任何一个都不匹配 则希望它回退到特定的枚举值 我发现了一个关于使用 EnumJsonAdapter 的 Moshi 问题 但我没有看到任何可供我使用的公共类 我使用的是莫西 1 8 0 关于如何实现此目标的任何想
  • 为什么我的 rdd 中的 println 会打印元素字符串?

    当我尝试打印 RDD 的内容时 它会打印如下所示的内容 如何打印内容 谢谢 scala gt lines res15 org apache spark rdd RDD Array String MapPartitionsRDD 3 at f
  • OpenCL 双精度与 CPU 双精度不同

    我正在 Linux 中使用 GeForce GT 610 卡进行 OpenCL 编程 我的CPU和GPU双精度结果不一致 我可以在这里发布部分代码 但我首先想知道是否有其他人遇到过这个问题 当我运行多次迭代的循环时 GPU 和 CPU 双精
  • 需要有关 jQuery UI Accordion navigationFilter 选项的帮助

    我正在建造一个用于导航的手风琴 手风琴的每个部分都有一组链接 触发代码如下所示 document ready function selector accordion collapsible true active false navigat
  • IPFIX 数据通过 UDP 传输至 C# - 我可以解码数据吗?

    我有一个来自 MSDN 网站的代码示例 用于创建 UDP 侦听器 客户端 因为我尝试从防火墙接收 IPFIX Netflow 数据 然后使用收到的数据 该代码确实有效并开始接收数据 但它的行话 见下文 所以我想我没有正确解码它 有谁知道我需
  • 使用 NSExpression 计算值的平方?

    NSString formul 3 2 NSExpression e NSExpression expressionWithFormat formul int result e expressionValueWithObject nil c
  • .NET Core Web API / Angular 应用程序中的 Windows 身份验证

    我正在使用 Visual Studio 2019 Community 构建一个 Intranet 应用程序 用于创建 NET Core Web Api 使用 NET Core 2 2 并使用 Visual Studio Code 来创建 A
  • 用于更新值和查询过去某个时间值的状态的数据结构

    假设您对一堆独立的时变值感兴趣 每个值都代表某事物的当前状态 这些值不会按任何固定的时间表更改 并且无法从旧值预测新值 举一个具体的例子 假设您有一堆股票 并且您有兴趣跟踪它们的价值 并且每当对该股票进行交易时 您都会获得有关该股票的更新
  • 从“StringTokenizer”获取原始字符串中的位置

    我需要获取字符串中以空格分隔的标记 但我还需要知道原始字符串中每个标记的字符位置starts 有什么办法可以做到这一点StringTokenizer 另外 据我了解 这是一个遗留类 有没有更好的替代方法StringTokenizer 你应该
  • 尝试用 Java 从文件中读取 2 个单词

    我正在尝试编写一个简单的程序来读取文本文件并将单词对存储在Set 这是我为此编写的代码 import java io File import java io FileNotFoundException import java util Sc
  • 即使关联类型不同,特征实现也会发生冲突

    我正在尝试创建一个通用结构来包装isize or an AtomicIsize 但是当我尝试为该结构的两种可能实现实现一个特征时 我遇到了错误 我创建了一个最小的示例来演示我的问题如下 use std sync atomic AtomicI