gpt4 book ai didi

rust - 为什么这个特征/实现不兼容 - 绑定(bind)生命周期与具体生命周期

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

我正在为这个错误而苦苦挣扎 rustc给我:

error: method `create_shader_explicit` has an incompatible type for trait: expected bound lifetime parameter 'a, found concrete lifetime

我的特征声明几乎是这样的:

pub trait GraphicsContext<R: Resources> {

/// Creates a shader object
fn create_shader<'a>(&'a self, shader::Stage, source: &str) ->
Result<handle::Shader<R>, shader::CreateError>;

}

这是我的实现,

pub struct OpenGLResources<'a> {
phantom: PhantomData<&'a u32>
}

impl<'a> Resources for OpenGLResources<'a> {
type Shader = Shader<'a>;
}

impl<'z> GraphicsContext<OpenGLResources<'z>> for OpenGLGraphicsContext {

/// Creates a shader object
fn create_shader<'a>(&'a self, stage: shader::Stage, source: &str) ->
Result<handle::Shader<OpenGLResources>, shader::CreateError> {

let shader = Shader::new(self, stage);
try!(shader.compile_from_source(source));

Ok(shader)
}

}

other questions在 StackOverflow 上,他们缺少类似 <'a> 的内容在 create_shader 之间和 () ,但是当我比较我的 fn 定义时,它们看起来是一样的。

编辑:

改变里面的定义impl对该问题进行以下修复

fn create_shader<'a>(&'a self, stage: shader::Stage, source: &str) ->     
Result<handle::Shader<OpenGLResources**<'z>**>, shader::CreateError>

但问题是 'a'z需要相同的生命周期。如果我将其更改为:

fn create_shader(**&'z** self, stage: shader::Stage, source: &str) -> 
Result<handle::Shader<OpenGLResources<'z>>, shader::CreateError>

impl block 有效,但我需要一种指定 'z 的方法特征定义中的生命周期。我尝试了以下方法:

pub trait<'z> GraphicsContext<R: Resources<'z>>

但是没有用。

最佳答案

当比较这样的东西时,您需要记住展开所有泛型,以便您可以实际比较它们。在这种情况下,您还没有扩展 R .如果这样做,答案就很明显了:ROpenGLResources<'z> , 链接 OpenGLResourcesimpl block ,而您的方法定义已经删除了 OpenGLResources 上的生命周期, 导致它被推断为 self的生命周期,即 'a .

关于rust - 为什么这个特征/实现不兼容 - 绑定(bind)生命周期与具体生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30960970/

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