【问题标题】:Why is this trait/implementation incompatible - bound lifetime vs concrete lifetime为什么这个特征/实现不兼容 - 绑定生命周期与具体生命周期
【发布时间】:2015-06-21 03:22:04
【问题描述】:

我正在努力解决这个错误 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)
    }

}

在 StackOverflow 上的 other questions 中,它们在 create_shader() 之间缺少诸如 &lt;'a&gt; 之类的东西,但是当我比较我的 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 块有效,但我需要一种在特征定义中指定 'z 生命周期的方法。我尝试了以下方法:

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

但它没有用。

【问题讨论】:

    标签: rust traits lifetime


    【解决方案1】:

    在比较这样的东西时,您需要记住扩展所有泛型,以便您可以实际上比较它们。在这种情况下,您还没有展开 R。如果你这样做,答案就很明显了:ROpenGLResources&lt;'z&gt;,将OpenGLResources 链接到impl 块,而你的方法定义已经省略了OpenGLResources 的生命周期,导致它被推断为@987654327 @的生命周期,即'a

    【讨论】:

    • 谢谢,这解决了问题,但现在我在问题中添加了一些其他问题。可以看看吗?
    • @neon64:这是一个新问题,真的,而且在这个设计中可能无法克服。您可能需要研究其他表示特征的方式。
    【解决方案2】:

    感谢@Chris Morgan 的提示,我设法实现了这个功能,现在它工作正常。

    如果我们从包含'a 生命周期的基本特征开始:

    trait Resources<'a> {
        type Shader: Shader;
        type ShaderProgram: ShaderProgram;
    }
    

    然后为 OpenGL 实现它。 (注意PhantomData 结构)

    struct OpenGLResources<'a> {
       phantom: PhantomData<&'a u32> // 'a is the lifetime of the context reference
    }
    
    impl<'a> ResourcesTrait<'a> for Resources<'a> {
        type Shader = Shader<'a>;
        type ShaderProgram = ShaderProgram<'a>;
        type CommandBuffer = CommandBuffer;
        type CommandBufferBuilder = CommandBufferBuilder;
    } 
    

    它有点冗长,但 GraphicsContext 特征现在也可以正常工作。 'a 生命周期位于类型参数部分。

    trait GraphicsContext<'a, R: Resources<'a>> {
    
        fn create_shader(&'a self, ty: Type, source: &str) -> Result<R::Shader, ShaderCreationError>
    
    }
    

    最后,这是图形上下文实现中所需的代码。 'a 生命周期随处可见,这非常冗长,但至少它有效!

    impl<'a> GraphicsContext<'a, Resources<'a>> for OpenGLGraphicsContext
    

    【讨论】:

      猜你喜欢
      • 2014-09-10
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      相关资源
      最近更新 更多