在 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 });
}
};
评论了检测到错误的地方。 我收到错误消息“没有重载函数的实例” 这是什么原因造成的?
使用大括号不允许缩小转换。
当您有
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)
)