应用程序在C ++文件中使用错误的模板函数定义

时间:2017-12-25 12:09:05

标签: c++ c++11 visual-studio-2017

我有一个存储特定变量的类,我使用模板来指定类型。这很重要,因为OpenGL具有不同的功能来更新着色器中的这些值。这是标题shader_variable.h

template<typename T, typename = std::enable_if<std::is_pointer<T>::value == false>>
class ShaderVariable : public Base::ShaderVariable
{
public:
    ShaderVariable(const std::string& a_Name, ShaderProgram& a_Program) :
        Base::ShaderVariable(a_Name, (Liane::Base::ShaderProgram&)a_Program, (void*)&m_Value),
        m_Name(a_Name)
    {
    }

    operator const T&() const { return m_Value; }
    const T& GetValue() const { return m_Value; }


    void Update() override;
private:
    std::string m_Name;
    T m_Value;
};

在CPP文件中,我有以下定义

template<> void ShaderVariable<glm::vec3>::Update()
{
    std::cout << "Updating vec3" << std::endl;
    glUniform3fv(m_Reference, 1, glm::value_ptr(m_Value));
}

template<> void ShaderVariable<glm::vec4>::Update()
{
    std::cout << "Updating vec4" << std::endl;
    glUniform4fv(m_Reference, 1, glm::value_ptr(m_Value));
}

template<> void ShaderVariable<glm::mat3>::Update()
{
    std::cout << "Updating mat3" << std::endl;
    glUniformMatrix3fv(m_Reference, 1, GL_FALSE, glm::value_ptr(m_Value));
}

template<> void ShaderVariable<glm::mat4>::Update()
{
    std::cout << "Updating mat4" << std::endl;
    glUniformMatrix4fv(m_Reference, 1, GL_FALSE, glm::value_ptr(m_Value));
}

在main函数中,我首先创建一个glm::mat4 ShaderVariable,然后是glm::vec3秒。如果我这样做,一切都编译好,所有ShaderVariables都调用glm :: mat4 Update()。

现在,通常我将模板定义放在头文件中,但由于复杂性,我更喜欢cpp文件。有没有办法缓解这个问题?

我还补充道 template class ShaderVariable<glm::vec3>; template class ShaderVariable<glm::vec4>; template class ShaderVariable<glm::mat3>;     最后,正如另一个问题的答案所暗示的那样,但这对我的问题毫无帮助。

0 个答案:

没有答案