8

我发现构造函数继承的语法有点奇怪。下面的例子效果很好,但我不明白为什么我需要指定using sysTrajectory::sysTrajectory而不是using sysTrajectory<Real>::sysTrajectory<Real>从类模板继承时?后者给出以下错误:expected ‘;’ before ‘&lt;’ 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);
4

2 回答 2

7

这种语法

using sysTrajectory::sysTrajectory; 

命名sysTrajectory. 这种语法

using sysTrajectory::sysTrajectory<Real>;

仅命名接受模板参数的构造函数<Real>(是的,您可以这样做,您可以在声明性上下文中将显式模板参数传递给构造函数)。您的基类似乎没有任何构造函数模板,因此您的编译器的解析器不接受sysTrajectory模板名称,因此不接受<作为打开模板参数列表。因此语法错误。

对于模板参数显式限定的模板名称,必须知道该名称以引用模板。

即使你有一个构造函数模板,使用声明的规则也禁止这样做。它说

using-declaration 不应命名模板 ID。

于 2013-05-26T15:23:06.577 回答
2

在 gcc 4.8.1 中,以下语法适用于我:

using sysTrajectory<Real>::sysTrajectory;
于 2014-07-25T13:55:02.970 回答