这是一个非常简单的C ++ 11程序,它测试了final
关键字的使用,以防止类被子类化:
template<class T> class Base final
{
public:
Base() {}
private:
T t;
};
class Derived : public Base<int> {};
int main(int, char **)
{
Derived d;
return 0;
}
如果我尝试在Mac OS X(Clang)下编译上述程序,我会收到预期的错误消息:
jeremy-friesners-mac-pro-3:~ jaf$ g++ -std=c++11 ./temp.cpp
./temp.cpp:10:28: error: base 'Base' is marked 'final'
class Derived : public Base<int> {};
^
./temp.cpp:1:29: note: 'Base' declared here
template<class T> class Base final
但是,如果我使用Visual Studio 2013在Windows下编译相同的代码,则编译时没有错误。但是,如果我将Base
类设置为非模板化,则Visual Studio会识别final
关键字并发出错误。
这是Visual Studio 2013中的错误,还是我错过了关于如何允许/期望final
关键字与模板化类一起运行的一些细微差别?
答案 0 :(得分:18)
这确实是一个错误。
N4296,[class] / p3:
如果某个类标有 class-virt-specifier
final
,并且它在库中显示为基类型说明符 -clause (第10条),该程序格式不正确。
答案 1 :(得分:13)
我相信它是VS 2013中的一个错误。
对于它的价值,VS 2015 CTP的编译器可以做到(我认为)你可能期望的那样:
test.cpp(10): error C3246: 'Derived': cannot inherit from 'Base<int>' as it has been declared as 'final'
答案 2 :(得分:-5)
我不知道组合的所有内部结构,但恕我直言,两个编译器都是&#34;正确的&#34;。 MSVC认为模板类是最终的,你不能从中派生出来。您使用模板类来定义类Base&lt; int&gt;,这不再是final。
恕我直言编译器的不同解释。