【问题标题】:c++11 inheriting template constructorsc++11继承模板构造函数
【发布时间】:2013-05-21 13:31:10
【问题描述】:

我发现构造函数继承的语法有点奇怪。下面的示例运行良好,但我不明白为什么从类模板继承时需要指定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);

【问题讨论】:

    标签: c++ inheritance c++11 constructor template-classes


    【解决方案1】:

    这个语法

    using sysTrajectory::sysTrajectory; 
    

    命名sysTrajectory 的所有构造函数。这个语法

    using sysTrajectory::sysTrajectory<Real>;
    

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

    要使模板名由模板参数显式限定,必须知道该名称才能引用模板。

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

    using-declaration 不应命名模板 ID。

    【讨论】:

      【解决方案2】:

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

      using sysTrajectory<Real>::sysTrajectory;
      

      【讨论】:

        猜你喜欢
        • 2013-09-04
        • 2014-01-29
        • 1970-01-01
        • 2013-12-24
        • 2017-08-05
        • 1970-01-01
        • 2019-12-14
        • 1970-01-01
        • 2014-10-19
        相关资源
        最近更新 更多