使用最终说明符

时间:2016-03-09 09:08:15

标签: c++ template-specialization visual-c++-2012

我有一个模板和一个如下定义的专业化:

template<typename T>
struct SomeTemplate final
{
};

template<>
struct SomeTemplate<int> final
{
};

int main()
{
    SomeTemplate<int> test; // <-- error
}

使用Visual C ++ 2012进行编译会出现以下错误:

error C2913: explicit specialization; 'SomeTemplate<T>' is not a specialization of a class template
    with
    [
        T=int
    ]

当我删除

时,它编译得很好并做正确的事情
  • final说明符
  • 专业化的template<>

第一种情况对我有意义,因为很可能final也限制了模板的特化(而不仅仅是继承)。第二种情况对我来说似乎有点奇怪,因为我认为这应该是语法错误。

这种行为是否正确?

1 个答案:

答案 0 :(得分:3)

我不确定天气是否是Visual C ++ 2012的错误,您的原始代码可以使用较新版本的VC ++ here进行编译。

  
      
  1. 因为它很可能是final也限制了模板的特化(而不仅仅是继承)
  2.   

不,final specifier与模板专业化无关。

  

指定无法在派生类中重写虚函数,或者无法继承类。

  
      
  1. 第二种情况对我来说有点奇怪,因为我认为这应该是语法错误。
  2.   

如果您删除template<>,则该语法应为error