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

Specialize C++ class template with final specifier

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

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 确实也限制了模板的特化(而不仅仅是继承)。第二种情况对我来说似乎有点奇怪,因为我认为这应该是一个语法错误。

这种行为是否正确?

我不确定它是否是 Visual C++ 2012 的错误,您的原始代码可以在更新版本的 VC++ here.

中正常编译
  1. as it may very well be that final does also restrict specialization of templates (instead of only inheritance)

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

Specifies that a virtual function cannot be overridden in a derived class or that a class cannot be inherited from.

  1. The second case seems a bit strange to me, as I thought this should be a syntax error.

是的,如果删除 template<>.

,它应该是语法 error