gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:27:05 32 4
gpt4 key购买 nike

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

考虑以下内容,其中 Probability 是实例化为 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() {};
};

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>

最佳答案

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

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这样的东西呢?如果一个加法的结果突然是一个指针,工作?

关于c++ - 专门的纯虚模板函数的另一个问题(未定义引用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42130980/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com