【问题标题】:error: specializing member requires 'template<>' syntax [duplicate]错误:专业化成员需要“模板<>”语法[重复]
【发布时间】: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&lt;VertexShader, ddVertexShader&gt; 是代码中某处的类型?

 error: specializing member '{anonymous}::Shader< VertexShader, IDirect3DVertexShader9*>::~ <unnamed>::VertexShaderBase< VertexShader, IDirect3DVertexShader9*>' requires 'template<>' syntax

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

【问题讨论】:

  • 错误信息似乎不言自明...当您尝试在前面使用 template&lt;&gt; 时发生了什么?
  • 它可以工作,但是我也在尝试理解代码以及为什么会发生这种情况
  • Shader 是用于定义类的模板,VertexShaderBase aka Shader&lt; VertexShader, ddVertexShader&gt; 是该模板的特定实例。当您更改模板的一个实例的行为时,这称为specialization。如果您一次更改整个类别实例的行为,那就是部分特化
  • 谢谢 Ben,让我看看我是否理解正确。所以着色器类中有一个析构函数。然后是我上面提到的析构函数。仅当着色器类的模板参数的类型为 `VertexShader, ddVertexShader` 时,才会调用着色器类的析构函数。我理解类的析构函数,就像任何其他方法被专门化一样。如果我错了,请纠正我
  • @MistyD 是的,没错

标签: c++


【解决方案1】:

您总是需要通过在模板前面放置template&lt;&gt; 来通知编译器您正在专门化模板。如果是部分特化,则可能是 template&lt;class X&gt;

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    相关资源
    最近更新 更多