gpt4 book ai didi

generics - 错误 : unable to infer enough type information about `_` ; type annotations or generic parameter binding required

转载 作者:行者123 更新时间:2023-11-29 08:22:30 25 4
gpt4 key购买 nike

为通用标题道歉。

下面是一些示例代码:

use std::marker::PhantomData;

pub trait Foo {
fn foo(&self);
}

pub trait Bar<A: Foo> {
fn bar(&self, a: A);
}

pub struct Test<A, B>
where A: Foo,
B: Bar<A>
{
_phantom_r: PhantomData<A>,
bars: Vec<B>,
}

impl<A, B> Test<A, B>
where A: Foo,
B: Bar<A>
{
pub fn new() -> Test<A, B> {
Test {
_phantom_r: PhantomData,
bars: Vec::new(),
}
}

pub fn add_bar(&mut self, b: B) {
self.bars.push(b);
}
}

fn main() {
let t = Test::new();
}

( Playground )

错误是:

<anon>:32:13: 36:22 error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [E0282]
<anon>:32 let t = Test::new();

我很困惑 Rust 在推断特征类型时遇到什么问题,以及我如何指定它想要什么。也就是说,我不确定这是否正确,因为那时我遇到了 Sized问题:

let t = Test::new() as Test<Foo,Bar<Foo>>;

错误:

<anon>:36:28: 36:46 error: the trait `core::marker::Sized` is not implemented for the type `Foo` [E0277]
<anon>:36 let t = Test::new() as Test<Foo,Bar<Foo>>;

我有两个主要问题:

  1. 为什么 Rust 无法推断 Test<A,B<A>> 的特征类型?
  2. 使这段代码工作的解决方案是什么?

最佳答案

简短的回答是你没有告诉它使用什么类型。

解释你的声明:

pub trait Foo {}

“有一个特质Foo

pub trait Bar<A: Foo> {}

“如果你给我一个实现了 A 的类型 Foo,我可以给你一个特征 Bar<A>。”

pub struct Test<A, B>
where A: Foo,
B: Bar<A> {}

“如果你给我类型 A ,它实现了 FooB ,它实现了 Bar<A> ,我会给你一个类型 Test<A,B>

let t = Test::new();

“给我一个Test”。这就是问题 - Test不是一个类型,它是一个模板,用于在给定两个其他类型(有一些限制)的情况下创建一个类型。在上面的示例中,您没有提供任何此类类型,只是缩小了此类类型的范围。

实际使用Test ,您需要提供类型:

struct MyA {}
impl Foo for MyA {
fn foo(&self) { println!("MyA::foo"); }
}

struct MyB {}
impl Bar<MyA> for MyB {
fn bar(&self, a: MyA) { println!("MyB::bar"); }

}

fn main() {
let test = Test::<MyA, MyB>::new();
}

( Playground )

关于generics - 错误 : unable to infer enough type information about `_` ; type annotations or generic parameter binding required,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37401681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com