【发布时间】:2015-03-13 23:12:43
【问题描述】:
我正在尝试将一些代码从 Visual Studio 解决方案移植到 GCC。代码看起来像这样,我试图理解为什么会出现这个问题
template <class BASE, class SHADER>
class Shader : public BASE {
...
...
~Shader()
{
someAssesrt(0);
}
};
typedef Shader< VertexShader, ddVertexShader> VertexShaderBase;
VertexShaderBase::~VertexShaderBase() <-- ERROR HERE
{
}
错误是:
error: specializing member '{anonymous}::Shader< VertexShader, IDirect3DVertexShader9*>::~ <unnamed>::VertexShaderBase< VertexShader, IDirect3DVertexShader9*>' requires 'template<>' syntax
我很难理解这个错误和其他一些代码组件。
首先这里发生了什么
typedef Shader< VertexShader, ddVertexShader> VertexShaderBase;
VertexShaderBase::~VertexShaderBase() <-- ERROR HERE
{
}
据我了解,创建了 VertexShaderBase 类型,然后实现了该类型的析构函数。 Shader 类型中不是已经定义了该类型的析构函数吗?如果我明白这一点,那么也许我可以弄清楚为什么会出现此错误。据我了解,Shader<VertexShader, ddVertexShader> 是代码中某处的类型?
error: specializing member '{anonymous}::Shader< VertexShader, IDirect3DVertexShader9*>::~ <unnamed>::VertexShaderBase< VertexShader, IDirect3DVertexShader9*>' requires 'template<>' syntax
我不确定这里发生了什么,帮助理解这段代码会很有帮助。
【问题讨论】:
-
错误信息似乎不言自明...当您尝试在前面使用
template<>时发生了什么? -
它可以工作,但是我也在尝试理解代码以及为什么会发生这种情况
-
Shader是用于定义类的模板,VertexShaderBaseakaShader< VertexShader, ddVertexShader>是该模板的特定实例。当您更改模板的一个实例的行为时,这称为specialization。如果您一次更改整个类别实例的行为,那就是部分特化。 -
谢谢 Ben,让我看看我是否理解正确。所以着色器类中有一个析构函数。然后是我上面提到的析构函数。仅当着色器类的模板参数的类型为 `VertexShader, ddVertexShader` 时,才会调用着色器类的析构函数。我理解类的析构函数,就像任何其他方法被专门化一样。如果我错了,请纠正我
-
@MistyD 是的,没错
标签: c++