У меня есть базовый класс шаблонов Vect, из которого получен VectDynamic.C++ - неопределенная ссылка на оператор базового класса
Базовый класс (Vect.h):
template <typename Elem>
class Vect
{
public:
virtual Elem& operator[](std::ptrdiff_t);
};
производный класс (VectDynamic.h):
#include "Vect.h"
template <typename Elem>
class VectDynamic: public Vect<Elem>
{
std::size_t _dim;
Elem* _val;
public:
explicit VectDynamic(std::size_t dim = 0): _dim(dim), _val(new Elem[dim]) {}
VectDynamic(std::size_t, const Elem&);
VectDynamic(const VectDynamic&);
Elem& operator[](std::ptrdiff_t) override;
};
template <typename Elem>
VectDynamic<Elem>::VectDynamic(std::size_t size, const Elem& e):
_dim(size), _val(new Elem[size])
{
for (std::size_t i = 0; i < size; ++i) _val[i] = e;
}
template <typename Elem>
VectDynamic<Elem>::VectDynamic(const VectDynamic& v):
_dim(v._dim), _val(new Elem[v._dim])
{
for (std::size_t i = 0; i < v._dim; ++i) _val[i] = v._val[i];
}
template <typename Elem>
Elem& VectDynamic<Elem>::operator[] (std::ptrdiff_t i)
{
if (std::size_t(i) >= _dim)
throw std::out_of_range("VectDynamic : Index out of range");
return _val[i];
}
Когда я пытаюсь создать экземпляр производного класса, как это (магистральный. CPP):
#include "VectDynamic.h"
int main()
{
VectDynamic<double> v1(5, 2);
return 0;
}
Я в конечном итоге, эта ошибка из обоих классов:
undefined reference to 'VectDynamic<double>::operator[](long)'
Теперь я знаю, что многие сообщения говорят об этой ошибке, но после нескольких часов поиска я не мог найти причин, почему это произойдет в моем случае.
Я не думаю, что ошибка возникла из того, как я включаю файлы, так как он не работает ни когда все находится в одном файле.
Я читал в сообщении this, что это может быть связано с неявным экземпляром базового класса, который продолжается, когда объявлен производный класс, поскольку методы базового класса еще не определены.
Как вы думаете, в чем проблема? Что было бы достойным обходным решением?
EDIT: Забыл добавить operator[]
от ребенка, добавлено его сейчас (оно не вызывало ошибок, как это было в моем коде).
Почему вы не '= 0 'на оператора декларации базового класса (так как вы, кажется, не хотят это определить)? – JSF
Сделать 'Vect'' operator []' pure virtual? – Bathsheba
Спасибо, оба исправили это, хотя я не понимаю, почему проблема не появилась раньше ... – Blublublub