如何修复"没有依赖于模板参数的参数'glGenVertexArrays'......"C++ 中的错误

How to fix 'there are no arguments to 'glGenVertexArrays' that depend on a template parameter ...' error in c++

本文关键字:参数 何修复 glGenVertexArrays 错误 C++ 依赖于      更新时间:2023-10-16

我有一个模板类,其中包含多个无符号的 int 和T*和 5 函数,并且只声明了其中一个,该类是在 .h 文件中创建的,最后它包含一个 .tcc 文件,其中将声明剩余的 4 个函数,在GenerateBuffer函数中,我使用多个 OpenGL 调用,所有这些调用都给出相同的错误there are no arguments to ‘glGenVertexArrays’ that depend on a template parameter, so a declaration of ‘glGenVertexArrays’ must be available

我曾经将函数声明放在一个.cpp文件中,而不是包含在 .h 文件的末尾,.cpp文件在开头包含 .h 文件,它没有给出任何错误,但是当尝试调用函数时,它会给出一个未声明的链接错误,目前我有这个

#define GL_GLEXT_PROTOTYPES 
#include <GLFW/glfw3.h>

在头文件中,我试图也将其放入.tcc文件的beining中,但是我遇到了相同的错误,尝试了两个相同的错误。我在网上找到的针对此错误的唯一解决方案是包括有问题的文件,但我一直有,或者添加using namespace但 glGenVertexArrays 不是任何命名空间的一部分,也不是我的类

头文件

#ifndef _VERTEXBUFFER_
#define _VERTEXBUFFER_
#include "../Core/Settings.h"
template<typename T> class VertexBuffer {
public:
unsigned int BufferId;
unsigned int IndexId;
unsigned int VAO;
T* Vertices;
unsigned int* Indexs;
int DrawCount() { return (Indexs != nullptr) ? sizeof(Indexs) / sizeof(Indexs[0]) : sizeof(Vertices) / sizeof(Vertices[0]);}
void GenerateBuffer(T data[]);
void SetIndexData(unsigned int data[]);
void Bind();
void UnBind();
};
#include "VertexBuffer.tcc"
#endif

有问题的函数

template<typename T> void VertexBuffer<T>::GenerateBuffer(T data[]) {
Vertices = data;
if (Settings::Engine == OpenGL) {
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glGenBuffers(1, &BufferId);
glBindBuffer(GL_ARRAY_BUFFER, BufferId);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), Vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, false, sizeof(data[0]), 0);
}
}

与您的实际问题略微无关,但恕我直言,太重要了,不能只放在评论中: 您正在以幼稚的方式使用sizeof运算符:

template<typename T>
void VertexBuffer<T>::GenerateBuffer(T data[])
{
glBufferData(…, sizeof(data), …, …);

它不是那样工作的。您会看到,sizeof返回您传入的表达式的结果的大小。写sizeof(1+2)同样有效.那么data的大小是多少?当然,表达结果的大小data。鉴于数据是一个数组函数参数(而不是实际的数组对象(,表达式data衰减为指针,因此sizeof(data)告诉您指针的大小,而不是数组的大小!

我只是在这里指出这一点,因为一旦你解决了那个原始问题,你无疑会陷入这个问题。

相关文章: