我有一个模板和一个如下定义的专业化:
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
也限制了模板的特化(而不仅仅是继承)。第二种情况对我来说似乎有点奇怪,因为我认为这应该是语法错误。
这种行为是否正确?
答案 0 :(得分:3)
我不确定天气是否是Visual C ++ 2012的错误,您的原始代码可以使用较新版本的VC ++ here进行编译。
- 因为它很可能是final也限制了模板的特化(而不仅仅是继承)
醇>
不,final specifier与模板专业化无关。
指定无法在派生类中重写虚函数,或者无法继承类。
和
- 第二种情况对我来说有点奇怪,因为我认为这应该是语法错误。
醇>
如果您删除template<>
,则该语法应为error。