C++ 专业纯虚拟模板功能的另一个问题(未定义参考)
作为初学者,我在模板、继承和纯虚拟函数方面有一些问题 考虑以下情况,其中概率是一个抽象模板,实例化为RationalProbability 概率h: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>&
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;