2015-06-21 38 views
1

我這個錯誤rustc掙扎給我:爲什麼這種特質/實施不兼容 - 束縛一生VS混凝土壽命

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()之間缺少<'a>之類的東西,但是當我比較我的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>> 

但它沒有奏效。

回答

0

感謝@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 
1

當比較這樣的事情時,您需要記住擴大所有的仿製藥,以便您可以將實際上與進行比較。在這種情況下,您還沒有擴大R。如果這樣做,答案將變得很明顯:ROpenGLResources<'z>,將OpenGLResources鏈接到impl塊,而您的方法定義忽略了OpenGLResources的生存期,導致它被推斷爲self的生存期,即'a

+0

謝謝,這解決了這個問題,但現在我遇到了一些問題。你能看一下嗎? – neon64

+0

@ neon64:這真是一個新問題,而且在這個設計中可能不會超越。你可能需要研究其他代表特質的方法。 –