Generics 又一次:“我的朋友们;应为类型参数,找到结构";

Generics 又一次:“我的朋友们;应为类型参数,找到结构";,generics,rust,Generics,Rust,关于这个特定的错误消息,已经有几个问题了。我读了所有的书,但我不知道我在这里面临的确切问题是什么,也不知道如何解决它 我有一个struct,它对传入的参数有一个要求,我想提供一些方便的函数来构造一个新实例。来了: use std::io::{Cursor, Read, Seek}; pub struct S<R: Read + Seek> { p: R, } impl<R: Read + Seek> S<R> { pub fn new(p:

关于这个特定的错误消息,已经有几个问题了。我读了所有的书,但我不知道我在这里面临的确切问题是什么,也不知道如何解决它

我有一个
struct
,它对传入的参数有一个要求,我想提供一些方便的函数来构造一个新实例。来了:

use std::io::{Cursor, Read, Seek};

pub struct S<R: Read + Seek> {
    p: R,
}

impl<R: Read + Seek> S<R> {
    pub fn new(p: R) -> Self {
        S { p }
    }

    pub fn from_string(s: String) -> Self {
        S::new(Cursor::new(s))
    }
}
使用std::io::{Cursor,Read,Seek};
发布结构{
p:R,
}
impl S{
新公共图书馆(p:R)->Self{
S{p}
}
pub fn from_string(s:string)->Self{
S::新建(光标::新建)
}
}
上述最小示例给出了以下错误:

错误[E0308]:类型不匹配
-->src/main.rs:13:16
|
13 | S::新建(光标::新建)
|^^^^^^^^^^^^^^^^^^应为类型参数,找到结构`std::io::Cursor`
|
=注意:应为'R'类型`
找到类型“std::io::Cursor”`
=帮助:以下是一些可能满足您需要的功能:
-.into_inner()

我尝试了许多变化,但我总是以同样的错误告终。还要注意的是,使用光标从其他地方(例如,
main
)调用
S::new
)可以正常工作。我知道这与泛型有关,等等(从对其他类似问题的回答来看),但是:我如何才能从我的
struct
impl
方法中提供这样的

我认为,在这种情况下,错误消息并不遥远。您的
impl
说明:

impl<R: Read + Seek> S<R>

现在一切都开始有意义了,非常感谢
use std::io::{Cursor, Read, Seek};

pub struct S<R: Read + Seek> {
    p: R,
}

impl<R: Read + Seek> S<R> {
    pub fn new(p: R) -> Self {
        S { p }
    }

}

impl S<Cursor<String>> {
    pub fn from_string(s: String) -> Self {
        S::new(Cursor::new(s))
    }
}