я получил следующее:C++: Расширение класса шаблон
template<typename T> class CVector3
{
CVector3<T> &normalize();
// more stuff
};
typedef CVector3<float> Vector3f;
typedef CVector3<double> Vector3d;
Я в принципе хочу добавить метод, toPoint(), который возвращает STRUCT Point3f, если T = поплавок и структура Point3d, если T = двойная. Я попытался заменить два определений типов с:
class Vector3f: public CVector3<float>
{
Point3f toPoint() const;
};
class Vector3d: public CVector3<double>
{
Point3d toPoint() const;
};
Это не работает, однако, потому что теперь нормализуют() не нарушается: он больше не возвращается Vector3f, но CVector3 < поплавок >, что несовместимо с Vector3f, потому что это, по сути, базовый класс. Я мог бы добавить методы-оболочки для normalize() и любого другого общедоступного метода в базовом классе, но я не хочу этого делать, потому что это сделало бы сохранение этих классов утомительным.
Я также попытался сдачи обратно определений типов и добавление вне определения шаблона:
template<>
Point3f CVector3<float>::toPoint() const;
template<>
Point3d CVector3<double>::toPoint() const;
Это не компилируется, потому что toPoint() не объявлен в определении шаблона. Я не могу поместить его внутри, из-за возвращаемого типа Point3f/Point3d.
Как это сделать? Любая помощь очень ценится!
Являются ли 'Point3f/Point3d' instantiad шаблонами? – jrok
нет, они простые структуры. –
Возможно, CRTP ...? –