专用纯虚拟模板函数(未定义引用)的另一个问题

Another issue with specialised pure virtual template function (undefined reference)

本文关键字:引用 另一个 问题 未定义 虚拟 函数 专用      更新时间:2023-10-16

作为一个初学者,我在模板、继承和纯虚函数方面有一些问题。

请考虑以下内容,其中概率是实例化为理性概率的抽象模板。

概率.h:

template <class T>
class Probability
{
public:
    T value;
    //Operator overloading for + 
    virtual Probability<T>* operator+(const Probability<T>& p);
    T getValue() const { return value; }
protected:
    Probability(T val) {
        value = val;
    }
    ~Probability() {};
};

概率.cpp : 空

RationalProbability.h:

#include "Probability.h"
class RationalProbability: public Probability<float>
{
    public:
        RationalProbability(float prob);
        virtual ~RationalProbability();
        RationalProbability* operator+(const RationalProbability& p);
};

合理概率.cpp:

#include "RationalProbability.h"
RationalProbability::RationalProbability(float prob): Probability(prob) {}
RationalProbability::~RationalProbability()
{
}
RationalProbability* RationalProbability::operator+(const   RationalProbability& p) {
    RationalProbability* rp = new RationalProbability(p.getValue() + this->value);
    return rp;
}

我收到以下错误:

Error:undefined reference to
  Probability<float>::operator+(Probability<float> const&)

确实,没有具有该确切签名的函数,但 RationalProbability 完全使用

RationalProbability: public Probability<float>

如果你想让基类有一个抽象函数(一个你没有实现的虚函数(,你应该这样说:

virtual Probability<T>* operator+(const Probability<T>& p) = 0;

= 0告诉编译器成员函数是一个抽象方法,必须被子类覆盖。

如果没有,则必须对所有虚函数进行定义(实现(。


如果您仔细查看错误消息,它说缺少的是Probability<float>::operator+,而不是RationalProbability::operator+

我还建议您阅读并检查一些规范运算符实现,特别是对于二进制算术运算符,因为您不应该从 operator+ 函数返回指针。它应该按值返回一个对象。否则,如果突然一次添加的结果是一个指针,那么像a + b + c这样的事情会如何工作?