Мой базовый класс:
//Element.h
class Element
{
public:
Element();
virtual ~Element(){}; // not sure if I need this
virtual Element& plus(const Element&);
virtual Element& minus(const Element&);
};
Производный шаблон класса:
//Vector.h
#include "Element.h"
template <class T>
class Vector: public Element {
T x, y, z;
public:
//constructors
Vector();
Vector(const T& x, const T& y = 0, const T& z =0);
Vector(const Vector& u);
...
//operations
Element& plus(const Element&) const;
Element& minus(const Element&) const;
...
};
...
//summation
template <class T>
Element& Vector<T>::plus(const Element& v) const
{
const Vector<T>& w = static_cast<const Vector<T>&>(v);
Vector<T>* ret = new Vector<T>((x + w.x), (y + w.y), (z + w.z));
return *ret;
}
//difference
template <class T>
Element& Vector<T>::minus(const Element& v) const
{
const Vector<T>& w = static_cast<const Vector<T>&>(v);
Vector<T>* ret = new Vector<T>((x - w.x), (y - w.y), (z - w.z));
return *ret;
}
У меня была другая проблема с этим кодом (ответ в другом посте ), но в настоящее время я борюсь с тем фактом, что, если я пытаюсь запустить это, я получаю
Неопределенные символы:
«Элемент :: плюс (Элемент const &)», на который ссылаются:
vtable для Vectorin main.o
«Элемент :: Элемент ()», на который ссылаются:
Vector :: Vector () в main.o
Vector :: Vector (двойной констант &, двойной констант &, двойной констант &) в main.o
"Элемент :: минус (Элемент const &)", ссылка с которого:
vtable для Vectorin main.o
"typeinfo для элемента", ссылка на которую:
typeinfo для Vectorin main.o
ld: символ (ы) не найдены
collect2: ld вернул 1 статус выхода
Это потому, что производный класс шаблона не размещен в том же файле, что и базовый класс, и это вызывает проблемы с компилятором (аналогично тому, как я должен был определить весь класс Vector в заголовочном файле)?
Я довольно новичок в C ++ и до сих пор читаю, что такое vtables и как они работают, но я пока не могу понять это.