在通用结构中派生 Show

Posted

技术标签:

【中文标题】在通用结构中派生 Show【英文标题】:Deriving Show in a generic struct 【发布时间】:2015-02-24 10:38:49 【问题描述】:

我试图理解 Rust 中的一些概念,但我遇到了一个非常简单的问题。我正在尝试定义一个然后要打印的结构。如果我指定组件的类型(在示例中将T 替换为f32),一切都很好。但是,如果我想通用地这样做:

#[deriving(Show)]
struct Point<T> 
    x: T,
    y: T,
    z: T,


fn main() 
    let v = Pointx: 3., y: 4., z: 5.,;
    println!("The point is " , v);

http://play.rust-lang.org/ 中的输出为:

错误:无法推断出足够的类型信息来定位 _ 类型的特征 core::fmt::Show;类型注释 必填

如果我尝试指定类型:

use std::fmt;

#[deriving(Show)]
struct Point<T: std::fmt::Show> 
    x: T,
    y: T,
    z: T,


fn main() 
    let v = Pointx: 3., y: 4., z: 5.,;
    println!("The point is " , v);

输出是:

错误:特征std::fmt::Show 已经出现在边界列表中 [E0127] 以前的出现在这里#[deriving(Show)]

这是为什么?如何解决?

【问题讨论】:

【参考方案1】:

3. 不够具体,无法单独命名类型 - 它可以是 f32f64。您可以(至少)通过以下两种方式更加明确:

let v = Pointx: 3f32, y: 4f32, z: 5f32;
let v: Point<f32> = Pointx: 3., y: 4., z: 5.;

【讨论】:

我以为我没有指定结构体,而不是我错误地实例化了结构体。 @Hernan:第一个错误确实是由于未指定结构的成员引起的。第二个错误似乎是#[deriving(Show)]自动添加Show绑定在T上引起的;通过自己添加它,它最终会出现两次。

以上是关于在通用结构中派生 Show的主要内容,如果未能解决你的问题,请参考以下文章

在多级继承中派生的虚拟基类会发生啥?

虚拟继承中派生类的大小

C ++中派生类的相等性测试[重复]

我可以从已部署的资源中派生二头肌模板吗? [复制]

C++ 命名空间中派生类中的 Qt 样式表(选择器)

C#中派生类调用基类构造函数用法分析