Я нахожу синтаксис наследования конструктора немного странным. Пример ниже работает хорошо, но я не понимаю, почему мне нужно указать 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);
Этот синтаксис
using sysTrajectory::sysTrajectory;
Имена всех конструкторов sysTrajectory
, Этот синтаксис
using sysTrajectory::sysTrajectory<Real>;
Имена только конструкторов, которые принимают аргумент шаблона <Real>
(да, вы можете сделать это, вы можете передать явные аргументы шаблона конструкторам в декларативном контексте). Ваш базовый класс не имеет никаких шаблонов конструктора, поэтому парсер компилятора не принимает sysTrajectory
в качестве имени шаблона и, следовательно, не принимает <
в качестве начального списка аргументов шаблона. Отсюда синтаксическая ошибка.
Чтобы имя шаблона было явно определено аргументами шаблона, должно быть известно, что имя ссылается на шаблон.
Даже если у вас был шаблон конструктора, правило использования объявлений также запрещает это. Это говорит
Объявление использования не должно называть идентификатор шаблона.
В gcc 4.8.1 у меня работает следующий синтаксис:
using sysTrajectory<Real>::sysTrajectory;