可变构造函数问题
Variadic constructor issue
我一直在做一个项目,但我遇到了一个奇怪的错误。我无法将 2 个 Shader 实例传递给可变参数构造函数,即使它说它支持 2 个 Shader 参数。
确切的错误信息:
E0289 构造函数“Program::Program”的实例不匹配参数列表
参数类型有:(Shader, Shader)
代码如下:
#pragma once
#include "Renderer.h"
#include "Shader.h"
class Program
{
public:
template<Shader&... shaders>
Program()
{
GLCall(m_RendererID = glCreateProgram());
AssignShaders(shaders...);
GLCall(glLinkProgram(m_RendererID));
GLCall(glValidateProgram(m_RendererID));
GLCall(glUseProgram(m_RendererID));
}
Program(const std::string& vertexShaderFilepath, const std::string& fragmentShaderFilepath)
{
Shader vertexShader(vertexShaderFilepath, GL_VERTEX_SHADER);
Shader fragmentShader(fragmentShaderFilepath, GL_FRAGMENT_SHADER);
Program(vertexShader, fragmentShader); // error is here
}
private:
unsigned int m_RendererID;
template<typename First, typename ...Shaders>
void AssignShaders(First& first, const Shaders&... other)
{
Shader& shader = (Shader&)first;
GLCall(glAttachShader(m_RendererID, shader.GetRendererID()));
AssignShaders(other...);
}
void AssignShaders() {};
};
这是调用程序构造函数的行:
Program program("resources/shaders/basic_vert.glsl", "resources/shaders/basic_frag.glsl");
您的构造函数缺少参数列表。它有一个可变模板参数,但是一个明确为空的参数列表。
除此之外,正如@richardcritten 提到的,您没有按预期委托构造函数,而是创建了 Program
的临时实例。委托(通过使用初始化列表),或直接调用 AssignShaders
。
另外不要忘记在这个class的析构函数中调用glDeleteProgram
,否则你会泄漏OpenGL资源!
我一直在做一个项目,但我遇到了一个奇怪的错误。我无法将 2 个 Shader 实例传递给可变参数构造函数,即使它说它支持 2 个 Shader 参数。
确切的错误信息: E0289 构造函数“Program::Program”的实例不匹配参数列表 参数类型有:(Shader, Shader)
代码如下:
#pragma once
#include "Renderer.h"
#include "Shader.h"
class Program
{
public:
template<Shader&... shaders>
Program()
{
GLCall(m_RendererID = glCreateProgram());
AssignShaders(shaders...);
GLCall(glLinkProgram(m_RendererID));
GLCall(glValidateProgram(m_RendererID));
GLCall(glUseProgram(m_RendererID));
}
Program(const std::string& vertexShaderFilepath, const std::string& fragmentShaderFilepath)
{
Shader vertexShader(vertexShaderFilepath, GL_VERTEX_SHADER);
Shader fragmentShader(fragmentShaderFilepath, GL_FRAGMENT_SHADER);
Program(vertexShader, fragmentShader); // error is here
}
private:
unsigned int m_RendererID;
template<typename First, typename ...Shaders>
void AssignShaders(First& first, const Shaders&... other)
{
Shader& shader = (Shader&)first;
GLCall(glAttachShader(m_RendererID, shader.GetRendererID()));
AssignShaders(other...);
}
void AssignShaders() {};
};
这是调用程序构造函数的行:
Program program("resources/shaders/basic_vert.glsl", "resources/shaders/basic_frag.glsl");
您的构造函数缺少参数列表。它有一个可变模板参数,但是一个明确为空的参数列表。
除此之外,正如@richardcritten 提到的,您没有按预期委托构造函数,而是创建了 Program
的临时实例。委托(通过使用初始化列表),或直接调用 AssignShaders
。
另外不要忘记在这个class的析构函数中调用glDeleteProgram
,否则你会泄漏OpenGL资源!