2013-05-26 109 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;