如何键入参数化不直接使用该类型的结构?

蚂蚁鬃毛

在过去,此代码已编译,但最近不再被接受(我相信自RFC 738以来)。我想对参数进行参数化VertexBuffer,但实际上并没有任何顶点,而是GPU拥有了顶点,而该结构仅拥有了OpenGL buffer_id

pub struct VertexBuffer<V: Vertex> {
    buffer_id: GLuint,
    num_vertices: usize,
}

new函数填充缓冲区:

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(),
        }
    }
    ....
}

我现在得到这些错误:

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> {

仅供参考,隐含的其他函数,例如pre_render()和post_render()使用V类型来完成其工作,调用诸如

let attribute_data = Vertex::attribute_data(None::<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(),
        }
    }
    ....
}

如果确实需要使用PhantomData,请尝试以下操作:

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,
        }
    }
    ....
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用一种类型以相同的结构键入函数签名和数组

如何禁止直接结构初始化

在已经键入的结构上执行结构类型

与该类型名称不匹配

Java泛型:绑定不匹配:类型不是该类型的bounded参数的有效替代品

如何使用Class对象作为参数化类型?

如何使用模板参数键入函数指针

Scala:如何使用类型参数化在类内部进行打印

当使用Bounded类型参数或直接使用Interface类型时

该类型出现在单个LINQ to Entities查询中的两个结构不兼容的初始化中

如何使用扩展语法将TypeScript类型添加到结构化参数中?

以允许可为空的类型并使用该类型参数声明`KClass <T>`的方式声明函数泛型类型参数。

流程:不建议使用存在类型,如何键入React元素?

Scala:如何实现包含scala“类型化”类而不包含其类型参数的java接口

结构数组参数的类型不兼容

键入记录字段以使用类型参数保存函数

当实现我需要的所有特征以引用该类型时,如何将类型直接存储在结构中?

使用“结构学生”类型的数组参数进行C编程与“结构学生*”类型的参数不兼容错误

如何使用模板化类作为参数类型?

如何获取参数化类型

此类型参数如何“键入”?

如何直接在OSGI捆绑jar文件中使用该类?

java,Generics-如何对类型为T的类进行参数化,该类T既可以扩展又可以实现

Java中的参数化类型不匹配

如何在结构中使用未使用的类型参数?

该类型出现在单个 LINQ to Entities 查询中的两个结构不兼容的初始化中

Mypy:如何将类型作为函数参数并对该类型调用类方法

如何静态断言该类型对于 c++20 中的模板非类型参数是可行的

如何使用格式化程序函数的可选对象键入函数返回类型