push_back() 函数在具有结构数据类型的向量上出错?

问题描述 投票:0回答:1

在 C++ 中为顶点缓冲区布局编写头文件。

#pragma once
#include <vector>
#include <GL/glew.h>

struct vertexBufferElement
{
    unsigned int type;
    unsigned int count;
    bool normalised;
};

class vertexBufferLayout
{
private:
    std::vector<vertexBufferElement> mElements;
public:
    vertexBufferLayout();
    template<typename T>
    void Push(int count)
    {
        static_assert(false);
    }

    template<>
    void Push<float>(int count)
    {
       //ERROR HERE
        mElements.push_back({ GL_FLOAT, count, false });
    }

    template<>
    void Push<unsigned int>(int count)
    {
       //ERROR HERE
        mElements.push_back({ GL_UNSIGNED_INT, count, false });
    }

    template<>
    void Push<unsigned char>(int count)
    {
       //ERROR HERE
        mElements.push_back({ GL_UNSIGNED_BYTE, count, true });
    }
};

评论了检测到错误的地方。 我收到错误消息“没有重载函数的实例” 这是什么原因造成的?

c++ opengl vector vertex-buffer
1个回答
0
投票

使用大括号不允许缩小转换。

当您有

mElements.push_back({ GL_FLOAT, count, false });
时,
int count
函数参数将缩小为
unsigned int count;
struct vertexBufferElement
成员,这是不允许的。所以正式来说,没有可以用
.push_back
调用的
{ GL_FLOAT, count, false }

GCC 在非模板上下文中接受此操作(发出

-Wnarrowing
,它不会使用
--pedantic
-Werror=narrowing
进行编译),但 clang 不会。同样,其他编译器和工具可能有不同的输出,这可能就是您的编译器和智能感知之间不匹配的原因

解决方法是修复你的类型(

void Push<float>(unsigned int count)
)

© www.soinside.com 2019 - 2024. All rights reserved.