2013-05-26 12 views
7

Trovo che la funzione di ereditarietà del costruttore in C++ 11 sia molto utile. Tuttavia, trovo la sintassi leggermente strana. L'esempio riportato di seguito funziona bene, ma non capisco perché devo specificare anziché using sysTrajectory<Real>::sysTrajectory<Real> quando si eredita da una classe modello? Quest'ultimo dà il seguente errore: previsto ";" prima del token "<" utilizzando sysTrajectory :: sysTrajectory ;. Potrebbero esserci dei potenziali problemi quando si ereditano i costruttori da un modello di classe?C++ 11 ereditari template ereditari

class sysRealTrajectory: public sysTrajectory<Real> 
{ 

    public: 

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

     using sysTrajectory::sysTrajectory;  

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

principale:

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

risposta

5

Questa sintassi

using sysTrajectory::sysTrajectory; 

Nomi tutti i costruttori di sysTrajectory. Questa sintassi

using sysTrajectory::sysTrajectory<Real>; 

nomi solo costruttori che accettano un argomento di template <Real> (sì, si può fare, si può passare argomenti espliciti template per i costruttori in contesti dichiarativa). La tua classe base non sembra avere alcun modello di costruttore, quindi il parser del tuo compilatore non prende sysTrajectory come nome-modello e quindi non accetta lo < come un elenco di argomenti del template di apertura. Da qui l'errore di sintassi.

For a template-name to be explicitly qualified by the template arguments, the name must be known to refer to a template.

Anche se si dispone di un modello di costruttore, una regola per l'utilizzo di dichiarazioni impedisce anche questo. Si dice

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

+0

Grazie per la spiegazione. – user1391279

1

In 4.8.1 gcc la seguente sintassi funziona per me:

using sysTrajectory<Real>::sysTrajectory;