2013-05-26 28 views
7

Ich finde Konstruktor Vererbung Feature in C++ 11 ziemlich nützlich. Allerdings finde ich die Syntax etwas seltsam. Das folgende Beispiel funktioniert gut, aber ich verstehe nicht, warum ich using sysTrajectory::sysTrajectory im Gegensatz zu using sysTrajectory<Real>::sysTrajectory<Real> beim Erben von einer Vorlage-Klasse angeben muss? Letzteres gibt den folgenden Fehler: erwartet ';' vor '<' Token mit sysTrajectory :: sysTrajectory ;. Könnte es beim Erben von Konstruktoren aus einer Klassenvorlage zu möglichen Problemen kommen?C++ 11 Erben Vorlage Konstruktoren

class sysRealTrajectory: public sysTrajectory<Real> 
{ 

    public: 

    /** 
     * Default constructor 
     */ 
     inline sysRealTrajectory(void); 

     using sysTrajectory::sysTrajectory;  

     /** 
     * Default destructor 
     */ 
     inline ~sysRealTrajectory(void); 
}; 

Haupt:

Real a; 
a=5; 
sysTrajectoryPoint<Real> TP0(1.0,a); 
sysRealTrajectory Trajectory(TP0); 

Antwort

5

Diese Syntax

using sysTrajectory::sysTrajectory; 

Namen alle Konstrukteure von sysTrajectory. Diese Syntax

using sysTrajectory::sysTrajectory<Real>; 

Namen nur Konstruktoren, die eine Vorlage Argument <Real> akzeptieren (ja, können Sie das tun, können Sie in deklarativen Kontexten explizite Template-Argumente an Konstruktoren übergeben). Ihre Basisklasse scheint keine Konstruktortemplates zu haben, so dass der Parser Ihres Compilers sysTrajectory nicht als Schablonenname akzeptiert und daher die < nicht als Eröffnungsvorlage-Argumentliste akzeptiert. Daher der Syntaxfehler.

Auch wenn Sie eine Konstruktorvorlage hatten, verbietet eine Regel zur Verwendung von Deklarationen das auch. Es sagt

A using-declaration shall not name a template-id.

+0

Sie für die Erklärung danken. – user1391279

1

In gcc 4.8.1 die folgende Syntax für mich funktioniert:

using sysTrajectory<Real>::sysTrajectory;