使用最终说明符专门化 C++ 类模板

Sim*_*ann 5 c++ template-specialization visual-c++-2012

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

template<typename T>
struct SomeTemplate final
{
};

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

int main()
{
    SomeTemplate<int> test; // <-- error
}
Run Code Online (Sandbox Code Playgroud)

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

error C2913: explicit specialization; 'SomeTemplate<T>' is not a specialization of a class template
    with
    [
        T=int
    ]
Run Code Online (Sandbox Code Playgroud)

当我删除时它编译得很好并且做正确的事情

  • 说明final
  • 来自template<>专业化

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

这种行为正确吗?

son*_*yao 4

我不确定这是否是 Visual C++ 2012 的错误,您的原始代码可以在此处的较新版本的 VC++ 中正常编译。

  1. 因为很可能 Final 也限制了模板的专业化(而不仅仅是继承)

不,最终说明符与模板专业化无关。

指定不能在派生类中重写虚函数或不能继承类。

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

是的,如果你删除它应该是一个语法错误template<>