【问题标题】:Variadic constructor issue可变构造函数问题
【发布时间】:2021-08-23 12:02:35
【问题描述】:

我一直在做一个项目,但我遇到了一个奇怪的错误。我不能将 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");

【问题讨论】:

  • 因为显示的代码不满足minimal reproducible example 的所有要求,正如stackoverflow.com 的help center 中所解释的那样,在你edit 它之前,任何人都不太可能帮助你确实如此。请参阅How to Ask 了解更多信息。
  • 该代码存在一大堆错误。你有使用非可变模板的经验吗?一旦您更加熟悉 C++ 模板背后的核心概念,您可能会更容易理解可变参数模板。
  • Program(vertexShader, fragmentShader); 没有构造函数接受两个 Shader 参数。有一个模板化的构造函数,但它接受 no 参数。此外,调用Program(vertexShader, fragmentShader); 不是委托构造函数,只会创建一个新的临时Program,然后将其销毁。请参阅此处的 委托构造函数 - en.cppreference.com/w/cpp/language/constructor for

标签: c++ templates c++14 variadic-templates


【解决方案1】:

您的构造函数缺少参数列表。它有一个可变参数模板参数,但参数列表显式为空。

除此之外,正如@richardcritten 所提到的,您没有按预期委托构造函数,而是创建了一个Program 的临时实例。委托(通过使用初始化列表),或直接调用AssignShaders

另外别忘了在这个类的析构函数中调用glDeleteProgram,不然会泄露OpenGL资源!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多