我這個錯誤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>>
但它沒有奏效。
謝謝,這解決了這個問題,但現在我遇到了一些問題。你能看一下嗎? – neon64
@ neon64:這真是一個新問題,而且在這個設計中可能不會超越。你可能需要研究其他代表特質的方法。 –