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);
};

главный :

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

8

Решение

Этот синтаксис

using sysTrajectory::sysTrajectory;

Имена всех конструкторов sysTrajectory, Этот синтаксис

using sysTrajectory::sysTrajectory<Real>;

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

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

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

Объявление использования не должно называть идентификатор шаблона.

7

Другие решения

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

using sysTrajectory<Real>::sysTrajectory;
2

По вопросам рекламы [email protected]