繁体   English   中英

C ++-对基类运算符的未定义引用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM