我正在尝试将一些代码从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
我不确定这里发生了什么,并且有助于理解这段代码会有所帮助。
答案 0 :(得分:0)
您始终需要通过在其前面放置template<>
来通知编译器您正在专门化模板。如果是部分特化,则可能是template<class X>
。
如果Microsoft编译器不要求这样做,那就错了。
在专门化模板类的模板函数时,语法特别有趣。见https://stackoverflow.com/a/4995106/13422