Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 专业纯虚拟模板功能的另一个问题(未定义参考)_C++_Templates_Inheritance - Fatal编程技术网

C++ 专业纯虚拟模板功能的另一个问题(未定义参考)

C++ 专业纯虚拟模板功能的另一个问题(未定义参考),c++,templates,inheritance,C++,Templates,Inheritance,作为初学者,我在模板、继承和纯虚拟函数方面有一些问题 考虑以下情况,其中概率是一个抽象模板,实例化为RationalProbability 概率h: template <class T> class Probability { public: T value; //Operator overloading for + virtual Probability<T>* operator+(const Probability<T>&

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

考虑以下情况,其中概率是一个抽象模板,实例化为RationalProbability

概率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() {};
};
#include "Probability.h"

class RationalProbability: public Probability<float>
{
    public:
        RationalProbability(float prob);
        virtual ~RationalProbability();
        RationalProbability* operator+(const RationalProbability& p);
};
我得到以下错误:

Error:undefined reference to
  Probability<float>::operator+(Probability<float> const&)
错误:未定义对的引用
概率::运算符+(概率常数&)
确实,没有具有该确切签名的函数,但是RationalProbability使用

RationalProbability: public Probability<float>
理性概率:公共概率
如果你想让基类有一个抽象函数(一个你没有实现的虚拟函数),你应该这么说:

virtual Probability<T>* operator+(const Probability<T>& p) = 0;
虚拟概率*运算符+(常数概率&p)=0;
=0
告诉编译器成员函数是必须由子类重写的抽象方法

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


如果仔细查看错误消息,就会发现缺少的是
Probability::operator+
,而不是
RationalProbability::operator+


我还特别建议您,因为您不应该从
操作符+
函数返回指针。它应该按值返回一个对象。否则,如果一次加法的结果突然变成了指针,像
a+b+c
这样的东西会如何工作?

您没有指定纯虚拟函数,因此需要实现。
运算符+()
返回指向动态分配对象的指针。。。。哎哟!!!这不是Java。
virtual Probability<T>* operator+(const Probability<T>& p) = 0;