C++11 наследование конструкторов шаблонов

Я нахожу синтаксис наследования конструктора немного странным. Пример ниже работает хорошо, но я не понимаю, почему мне нужно указать 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);
};

main:

Real a;
a=5;
sysTrajectoryPoint<Real> TP0(1.0,a);
sysRealTrajectory Trajectory(TP0);

2 ответов


этот синтаксис

using sysTrajectory::sysTrajectory; 

имена всех строителей sysTrajectory. Этот синтаксис

using sysTrajectory::sysTrajectory<Real>;

имена только конструкторы, которые принимают аргумент шаблона <Real> (Да, вы можете это сделать, вы можете передать явные аргументы шаблона конструкторам в декларативных контекстах). Базовый класс не имеет шаблонов конструкторов, поэтому синтаксический анализатор компилятора не принимает sysTrajectory в качестве имени шаблона и, следовательно, не принимает < как шаблон открытия список аргументов. Отсюда и синтаксическая ошибка.

чтобы имя шаблона было явно определено аргументами шаблона, имя должно быть известно для ссылки на шаблон.

даже если у вас есть шаблон конструктора, правило использования объявлений запрещает это тоже. Тут написано

a using-declaration не должен называть идентификатор шаблона.


в gcc 4.8.1 для меня работает следующий синтаксис:

using sysTrajectory<Real>::sysTrajectory;