2013-05-26 169 views
7

我發現C++ 11中的構造函數繼承特性非常有用。不過,我覺得它的語法有點奇怪。下面的例子效果很好,但我不明白爲什麼我需要指定using sysTrajectory::sysTrajectory而不是從模板類繼承using sysTrajectory<Real>::sysTrajectory<Real>?後者給出以下錯誤:使用sysTrajectory :: sysTrajectory;在'<'令牌之前預期';'。從類模板繼承構造函數時是否會有任何潛在的問題?C++ 11繼承模板構造函數

class sysRealTrajectory: public sysTrajectory<Real> 
{ 

    public: 

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

     using sysTrajectory::sysTrajectory;  

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

主:

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

回答

5

這句法

using sysTrajectory::sysTrajectory; 

名稱的sysTrajectory所有構造函數。這句法

using sysTrajectory::sysTrajectory<Real>; 

名只接受一個模板參數<Real>一個構造函數(是的,你可以做到這一點,你可以通過明確的模板參數在聲明上下文構造函數)。您的基類似乎沒有任何構造函數模板,因此您的編譯器的解析器不會將sysTrajectory作爲模板名稱,因此不接受<作爲開始模板參數列表。因此,語法錯誤。

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

即使您有一個構造函數模板,使用聲明的規則也禁止這樣做。它說

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

+0

謝謝你的解釋。 – user1391279

1

在GCC 4.8.1以下語法爲我工作:

using sysTrajectory<Real>::sysTrajectory;