2014-09-19 8 views
10

GCC 4.8.1 akzeptiertWas ist die standardkonforme Syntax für die Vererbung von Template-Konstruktoren?

template <typename T> 
class Subclass : public Baseclass<T> 
{ 
public: 
    using typename Baseclass<T>::Baseclass; 
}; 

aber MSVC nicht. Auf der anderen Seite akzeptiert MSVC

aber GCC nicht. Dann habe ich eine andere Art von Erklärung in dieser Frage gesehen: c++11 inheriting template constructors

template <typename T> 
class Subclass : public Baseclass<T> 
{ 
public: 
    using typename Baseclass::Baseclass<T>; 
}; 

für die MSVC warnt vor einem „veralteten Erklärung Stil“ und GCC sagt

prog.cpp:8:24: error: ‘template<class T> class Baseclass’ used without template parameters 
     using typename Baseclass::Baseclass<T>; 

Ich dachte, das erste Beispiel das wäre Standardkonforme Syntax. Intuitiv sieht es für mich richtig aus.

Was ist die C++ 11 Standard konforme Syntax?

+3

Welche MSVC-Version? VS2013 unterstützt keine ererbenden Konstruktoren. AFAIK, der erste ist die korrekte Syntax. 'using Baseclass :: BaseClass ' sollte für Fälle funktionieren, in denen 'BaseClass' selbst keine Klassenvorlage ist, sondern eine Konstruktorvorlage hat. – Praetorian

+0

@Praetorian Jetzt ist das überraschend. Aber ich habe immer nur den Standard- und Kopierkonstruktor benutzt, und jetzt, nachdem ich einen anderen Konstruktor getestet habe, sehe ich, dass Sie Recht haben. Werden Kopier- und Standardkonstruktoren automatisch geerbt? –

+1

Sie müssen den Standard überprüfen, aber ich bin mir ziemlich sicher, dass die speziellen Memberfunktionen * nie * vererbt werden. Sie können vom Compiler automatisch in der abgeleiteten Klasse deklariert werden, indem sie den üblichen Regeln für ihre Erzeugung folgen. – Praetorian

Antwort

2

Die Antwort ist ein wenig im Standard vergraben. Eine Erklärung wird als unter Verwendung von (7.3.3) definiert sind:

using [typename] nested-name-specifier unqualified-id; 

Die nested-name-specifier nach einigen Schritten in simple-template-id löst die als

template-name < [template-argument-list] > 

Kurz gesagt definiert ist, ist die Standard-Syntax konform

template <typename T> 
class Subclass : public Baseclass<T> 
{ 
public: 
    using typename Baseclass<T>::Baseclass; 
}; 
+0

Vielen Dank! –

Verwandte Themen