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受け入れません。<したがって、構文エラー。

template-name がテンプレート引数によって明示的に修飾されるためには、その名前がテンプレートを参照するために知られている必要があります。

コンストラクター テンプレートがあったとしても、宣言を使用するための規則によってそれも禁止されています。それは言う

using-declaration は template-id を指定してはなりません。

于 2013-05-26T15:23:06.577 に答える