【发布时间】:2015-12-08 16:06:05
【问题描述】:
我有一个模板基类 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)'
现在我知道很多帖子都在谈论这种错误,但经过数小时的搜索,我找不到任何原因导致我的情况发生这种错误。
我认为错误不会来自我包含文件的方式,因为当所有内容都在一个文件中时它也不起作用。
我在this 的帖子中读到,这可能是由于基类的隐式实例化在声明派生类时进行的,因为尚未定义基类的方法。
您认为这是问题所在吗? 什么是体面的解决方法?
编辑:忘记添加孩子的operator[],现在添加(它没有导致任何错误,因为它在我的代码中)。
【问题讨论】:
-
为什么基类运算符声明中没有
=0(因为您似乎不想定义它)? -
制作
Vectoperator[]纯虚拟? -
谢谢你们,解决了,虽然我不明白为什么问题没有早点出现......
标签: c++ templates inheritance operator-overloading