Вот очень простая программа на 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
Однако, если я компилирую тот же код под Windows с помощью Visual Studio 2013, он компилируется без ошибок. Однако, если я сделаю класс Base
без шаблона, Visual Studio распознает ключевое слово final
и выдаст ошибку.
Является ли это ошибкой в Visual Studio 2013 или мне не хватает некоторых нюансов о том, как ключевое слово final
может / должно работать в сочетании с шаблонными классами?