gpt4 book ai didi

泛型错误 : expected type parameter, 找到结构

转载 作者:行者123 更新时间:2023-11-29 07:49:58 25 4
gpt4 key购买 nike

我开始了一个新项目,我希望尽可能地模块化,我的意思是我希望将来能够用其他部分替换某些部分。这似乎是 traits 的完美用法,目前我有这段代码:

mod parser;
mod renderer;
mod renderers;

use parser::MarkParser;
use renderer::MarkRenderer;

struct Rustmark <P: MarkParser, R: MarkRenderer> {
parser: P,
renderer: R,
}


impl <P: MarkParser, R: MarkRenderer> Rustmark <P, R> {
fn new() -> Rustmark <P, R> {
Rustmark {
parser: parser::DefaultParser::new(),
renderer: renderers::HTMLRenderer::new(),
}
}

fn render(&self, input: &str) -> &str {
self.renderer.render(self.parser.parse(input))
}
}

但是我遇到了一些错误,主要是这个:

error: mismatched types: expected Rustmark<P, R>, found Rustmark<parser::DefaultParser, renderers::html::HTMLRenderer> (expected type parameter, found struct parser::DefaultParser) [E0308]

还有一些像这样的终身错误:

error: cannot infer an appropriate lifetime for automatic coercion due to conflicting requirements

help: consider using an explicit lifetime parameter as shown: fn parse<'a>(&'a self, input: &'a str) -> &str

我已经尝试过多次调整以使其工作,但似乎没有一个能让编译器满意。所以我想知道这是否是正确的方法,以及我可以做些什么来让它发挥作用。

最佳答案

第一个错误:你创建了一个 Rustmark具有字段 parser 的对象类型 DefaultParser和领域 renderer类型 HTMLRenderer , 但该函数应返回 Rustmark <P, R> .通常 P 不是 DefaultParser 类型并且 R 不是 HTMLRenderer 类型,所以它永远不会编译。如果您想要正确类型的默认值,一个好的解决方案是绑定(bind) PR实现Default trait ,这样:

use std::default:Default;

impl <P: MarkParser + Default, R: MarkRenderer + Default> Rustmark <P, R> {
fn new() -> Rustmark <P, R> {
Rustmark {
parser: P::default(),
renderer: R:default(),
}
}
}

第二个错误:主要问题是你返回了一个可能会在 render 中消失的东西的引用。方法(可能是您在内部 String 方法中分配的 render)。编译器告诉您它不知道该引用指向的对象的生命周期,因此它不能保证该引用有效。您可以指定生命周期参数,但在您的情况下,最好的解决方案可能是返回 String对象本身,而不是引用。

关于泛型错误 : expected type parameter, 找到结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31060851/

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