错误:专门成员需要'模板<>'句法

时间:2015-03-13 23:12:44

标签: c++

我正在尝试将一些代码从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

我不确定这里发生了什么,并且有助于理解这段代码会有所帮助。

1 个答案:

答案 0 :(得分:0)

您始终需要通过在其前面放置template<>来通知编译器您正在专门化模板。如果是部分特化,则可能是template<class X>

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

在专门化模板类的模板函数时,语法特别有趣。见https://stackoverflow.com/a/4995106/13422