[英]C++ - undefined reference to Base class operator
我有一个模板基类Vect,派生自VectDynamic。
基类(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];
}
当我尝试创建这样的派生类的实例(main.cpp)时:
#include "VectDynamic.h"
int main()
{
VectDynamic<double> v1(5, 2);
return 0;
}
我最终在两个类中都遇到此错误:
undefined reference to 'VectDynamic<double>::operator[](long)'
现在,我知道许多帖子都在谈论这种错误,但是经过数小时的搜索,我仍然找不到发生这种情况的任何原因。
我认为错误不会来自于我包含文件的方式,因为当所有内容都在单个文件中时,它也不起作用。
我在这篇文章中已经读到,这可能是由于在声明派生类时基类的隐式实例化所致,因为尚未定义基类的方法。
您是否认为这是问题所在? 什么是一个不错的解决方法?
编辑 :忘记从子级添加operator[]
,现在将其添加(它并没有像我的代码中那样引起任何错误)。
从错误中可以很明显地看出,您只是没有定义VectDynamic<double>::operator[]
。 如果您不希望[]运算符,只需删除函数声明即可。 如果确实需要,则需要实现它。
请注意,由于它是模板类,因此无法在非标题源文件中实现运算符。
现在,我已经说了这么多,我也要指出一点,因为您没有(正确地)遵循0、3或5的规则,这将导致内存泄漏。 您没有使用std::vector
的原因是什么?
即使Vect<double>::operator[]
永远都不会被调用,但在构造派生对象的过程中必须暂时使用基本vtable,并且在声明时,基本vtable具有指向该未定义方法的指针。 应该通过在基本方法的声明中添加“ = 0”(通常称为“纯虚拟”)来解决。
改成
template <typename Elem>
class Vect
{
public:
virtual Elem& operator[](std::ptrdiff_t)=0;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.