专门的纯虚拟模板功能的另一个问题(未定义的引用)

时间:2017-02-09 07:50:25

标签: c++ templates inheritance

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

考虑以下内容,其中Probability是一个实例化为RationalProbability的抽象模板。

Probability.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() {};
};

Probability.cpp:空

RationalProbability.h:

#include "Probability.h"

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

RationalProbability.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>

1 个答案:

答案 0 :(得分:3)

如果您希望基类具有抽象功能(您未实现的虚拟功能),您应该这样说:

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

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

如果没有,那么必须是所有虚函数的定义(实现)。

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

我还建议您read and check some canonical operator implementations,尤其是for the binary arithmetic operators,因为您不应该从operator+函数返回指针。它应该按值返回一个对象。否则,如果突然一次添加的结果是一个指针,那么a + b + c之类的东西会如何工作?