【发布时间】: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