Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何键入参数化一个没有';你不能直接用那种类型吗?_Rust - Fatal编程技术网

Rust 如何键入参数化一个没有';你不能直接用那种类型吗?

Rust 如何键入参数化一个没有';你不能直接用那种类型吗?,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:

在过去,这段代码是经过编译的,但最近它不再被接受了(我相信从那时起)。我想键入parameterize the
VertexBuffer
,但它实际上并不包含任何顶点,而是由GPU保存顶点,而结构只保存OpenGL
buffer\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,
        }
    }
    ....
}