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 не должен называть идентификатор шаблона.