Hier ist ein sehr einfaches C++ 11-Programm, das die Verwendung des final
Keyword-Tests aus einer Klasse zu verhindern subclassed werden:Warum darf dieser Code unter Visual Studio 2013 kompiliert werden?
template<class T> class Base final
{
public:
Base() {}
private:
T t;
};
class Derived : public Base<int> {};
int main(int, char **)
{
Derived d;
return 0;
}
Wenn ich versuche, das obige Programm unter Mac zu kompilieren OS X (Clang), erhalte ich die erwarteten Fehlermeldungen:
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
Allerdings, wenn ich den gleichen Code unter Windows mit Visual Studio 2013 zu kompilieren, kompiliert es ohne Fehler. Wenn ich die Base
Klasse nicht vorschreibt, erkennt Visual Studio jedoch das Schlüsselwort final
und gibt einen Fehler aus.
Ist das ein Fehler in Visual Studio 2013 oder fehlt mir etwas Nuance darüber, wie das final
-Schlüsselwort in Verbindung mit Vorlagenklassen funktionieren soll/wird?
'klasse Abgeleitet: öffentliche Basis' macht es sehr offensichtlich, dass 'Abgeleitet' tatsächlich abgeleitet wird; Es gibt keinen Interpretationsspielraum (zum Glück). –
molbdnilo
_ "beide Compiler sind 'korrekt' ... unterschiedliche Interpretation der Compiler" _ [Dies ist wohldefiniertes Verhalten] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014) /n4296.pdf) und [Visual Studio ist falsch] (http://stackoverflow.com/a/29710305/1350209). –
yeah right ... wenn die Template-Klasse Base instanziiert wird, bekommt sie das "final". Meine fehlende Lücke ... –
relascope