错误:专业成员需要"模板<>"语法

error: specializing member requires 'template<>' syntax

本文关键字:模板 语法 lt gt 成员 错误      更新时间:2023-10-16

我正在尝试将一些代码从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<>。如果是部分专业化,则可能会template<class X>

如果Microsoft编译器不需要这样做,那么它就做错了。

当专门化模板类的模板函数时,语法变得特别有趣。请参阅 https://stackoverflow.com/a/4995106/13422