我发现构造函数继承的语法略显奇怪。下面的示例运行良好,但我不明白为什么在从类模板继承时需要指定using sysTrajectory::sysTrajectory
而不是using sysTrajectory<Real>::sysTrajectory<Real>
?后者给出了以下错误:expected ‘;’ before ‘<’ token using sysTrajectory<Real>::sysTrajectory<Real>;
。
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);
答案 0 :(得分:7)
此语法
using sysTrajectory::sysTrajectory;
命名sysTrajectory
的所有构造函数。这个语法
using sysTrajectory::sysTrajectory<Real>;
仅指定接受模板参数<Real>
的构造函数(是的,您可以这样做,您可以将显式模板参数传递给声明性上下文中的构造函数)。您的基类似乎没有任何构造函数模板,因此编译器的解析器不会将sysTrajectory
作为模板名称,因此不接受<
作为开始模板参数列表。因此语法错误。
对于要由模板参数显式限定的模板名称,必须知道名称才能引用模板。
即使你有一个构造函数模板,使用声明的规则也禁止这样做。它说
using-declaration不得命名template-id。
答案 1 :(得分:2)
在gcc 4.8.1中,以下语法适用于我:
using sysTrajectory<Real>::sysTrajectory;