可变构造函数问题

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资源!