Rust 如何键入参数化一个没有';你不能直接用那种类型吗?
在过去,这段代码是经过编译的,但最近它不再被接受了(我相信从那时起)。我想键入parameterize theRust 如何键入参数化一个没有';你不能直接用那种类型吗?,rust,Rust,在过去,这段代码是经过编译的,但最近它不再被接受了(我相信从那时起)。我想键入parameterize theVertexBuffer,但它实际上并不包含任何顶点,而是由GPU保存顶点,而结构只保存OpenGLbuffer\u id: pub struct VertexBuffer<V: Vertex> { buffer_id: GLuint, num_vertices: usize, } 我现在得到这些错误: src/vertex_buffer.rs:10:25:
VertexBuffer
,但它实际上并不包含任何顶点,而是由GPU保存顶点,而结构只保存OpenGLbuffer\u id
:
pub struct VertexBuffer<V: Vertex> {
buffer_id: GLuint,
num_vertices: usize,
}
我现在得到这些错误:
src/vertex_buffer.rs:10:25: 10:26 error: parameter `V` is never used
src/vertex_buffer.rs:10 pub struct VertexBuffer<V: Vertex> {
src/vertex_buffer.rs:10:25: 10:26 help: consider removing `V` or using a marker such as `core::marker::PhantomData`
src/vertex_buffer.rs:10 pub struct VertexBuffer<V: Vertex> {
src/vertex\u buffer.rs:10:25:10:26错误:从未使用参数'V'
src/vertex_buffer.rs:10发布结构VertexBuffer{
SRC/VisteXBuff.RS:10:25:10:26帮助:考虑删除“V”或使用标记,如“核心::标记::幻像”
src/vertex_buffer.rs:10发布结构VertexBuffer{
仅供参考,impl中的其他函数,如pre_render()和post_render()使用V类型来执行其工作,并调用
let attribute_data = Vertex::attribute_data(None::<V>);
let attribute_data=Vertex::attribute_data(无:);
您没有显示足够的代码来排除此问题,因此我建议将您的类型移动到函数:
impl VertexBuffer{
pub fn new(数据:&Vec)->VertexBuffer{
让缓冲区\u id=不安全{
设mut-id:GLuint=0;
gl::GenBuffers(1,&mut id);
gl::BindBuffer(gl::ARRAY\u BUFFER,id);
gl::BufferData(gl::ARRAY_BUFFER,
(mem::size_of::()*data.len())作为GLsizeiptr,
mem::transmute(&数据[0]),
gl::静态绘制);
身份证件
};
顶点缓冲区{
缓冲区id:缓冲区id,
num_顶点:data.len(),
}
}
....
}
如果确实需要使用,请尝试以下方法:
struct VertexBuffer<V> {
buffer_id: u32, // or whatever
num_vertices: u32, // or whatever
marker: std::marker::PhantomData<V>,
}
impl<V: Vertex> VertexBuffer<V> {
pub fn new(data: &Vec<V>) -> VertexBuffer<V> {
let buffer_id = unsafe {
let mut id: GLuint = 0;
gl::GenBuffers(1, &mut id);
gl::BindBuffer(gl::ARRAY_BUFFER, id);
gl::BufferData(gl::ARRAY_BUFFER,
(mem::size_of::<V>() * data.len()) as GLsizeiptr,
mem::transmute(&data[0]),
gl::STATIC_DRAW);
id
};
VertexBuffer {
buffer_id: buffer_id,
num_vertices: data.len(),
marker: std::marker::PhantomData,
}
}
....
}
struct VertexBuffer{
buffer\u id:u32、//或其他
num_顶点:u32、//或其他
marker:std::marker::PhantomData,
}
impl顶点缓冲区{
pub fn new(数据:&Vec)->VertexBuffer{
让缓冲区\u id=不安全{
设mut-id:GLuint=0;
gl::GenBuffers(1,&mut id);
gl::BindBuffer(gl::ARRAY\u BUFFER,id);
gl::BufferData(gl::ARRAY_BUFFER,
(mem::size_of::()*data.len())作为GLsizeiptr,
mem::transmute(&数据[0]),
gl::静态绘制);
身份证件
};
顶点缓冲区{
缓冲区id:缓冲区id,
num_顶点:data.len(),
marker:std::marker::PhantomData,
}
}
....
}
我考虑过这一点。但是,在impl of VertexBuffer中的其他函数也使用type参数,我希望当VertexBuffer是用一种顶点类型创建的,并与另一种顶点类型一起使用时,类型系统会发现不匹配。我正在尝试你的第二个建议…@AntManelope听起来你需要PhantomData
。是吗你的结构负责在完成时释放缓冲区?你能返回一个顶点
es吗?是的,它实现了释放缓冲区的Drop特性。顶点永远不会返回,但会调用特定V类型的函数(修改原始问题以显示)。
impl VertexBuffer {
pub fn new<V: Vertex>(data: &Vec<V>) -> VertexBuffer<V> {
let buffer_id = unsafe {
let mut id: GLuint = 0;
gl::GenBuffers(1, &mut id);
gl::BindBuffer(gl::ARRAY_BUFFER, id);
gl::BufferData(gl::ARRAY_BUFFER,
(mem::size_of::<V>() * data.len()) as GLsizeiptr,
mem::transmute(&data[0]),
gl::STATIC_DRAW);
id
};
VertexBuffer {
buffer_id: buffer_id,
num_vertices: data.len(),
}
}
....
}
struct VertexBuffer<V> {
buffer_id: u32, // or whatever
num_vertices: u32, // or whatever
marker: std::marker::PhantomData<V>,
}
impl<V: Vertex> VertexBuffer<V> {
pub fn new(data: &Vec<V>) -> VertexBuffer<V> {
let buffer_id = unsafe {
let mut id: GLuint = 0;
gl::GenBuffers(1, &mut id);
gl::BindBuffer(gl::ARRAY_BUFFER, id);
gl::BufferData(gl::ARRAY_BUFFER,
(mem::size_of::<V>() * data.len()) as GLsizeiptr,
mem::transmute(&data[0]),
gl::STATIC_DRAW);
id
};
VertexBuffer {
buffer_id: buffer_id,
num_vertices: data.len(),
marker: std::marker::PhantomData,
}
}
....
}