以下课程有2个问题。我有2个错误:第一个可能是关于模板类之间继承的问题,另一个关于在这个类实际上不是抽象时初始化抽象类的问题(参见代码中的注释)
some_header.h
template <typename T, typename R>
class SDE // abstract class
{
protected:
T drift, diffusion; // drift and diffusion terms
T initialValue;
Interval<R> range;
public:
virtual T GetInitialValue() = 0; // initial condition
virtual T GetDrift() = 0;
virtual T GetDiffusion() = 0;
virtual ~SDE();
};
#include "SDE.h"
#include <cmath>
template <typename T, typename R> // Cox, Ingersoll, Ross sde
class CIRSDE : public SDE<T,R>
{
private:
T kappa, theta, sigma;
public:
CIRSDE(const T& _initialValue,
const Interval<R>& _range,
const T& _kappa,
const T& _theta,
const T& _sigma);
CIRSDE();
~CIRSDE(){};
T GetInitialValue();
T GetDrift(const T& t, const T& r);
T GetDiffusion(const T& t, const T& r);
};
template <typename T, typename R>
CIRSDE<T,R> :: CIRSDE(const T& _initialValue,
const Interval<R>& _range,
const T& _kappa,
const T& _theta,
const T& _sigma)
{
kappa = _kappa;
theta = _theta;
sigma = _sigma;
SDE<T,R> :: initialValue = _initialValue;
SDE<T,R> :: range = _range;
}
template <typename T, typename R>
CIRSDE<T,R> :: CIRSDE()
{
kappa = 1;
theta = 1;
sigma = 1;
SDE<T,R> :: initialValue = 1;
SDE<T,R> :: range = Interval<R>(0,1);
}
template <typename T, typename R>
T CIRSDE<T,R> :: GetDrift (const T& t, const T& r)
{
return kappa * (theta - r);
}
template <typename T, typename R>
T CIRSDE<T,R> :: GetDiffusion(const T& t, const T& r)
{
return sigma * sqrt(r);
}
template <typename T, typename R>
T CIRSDE<T,R> :: GetInitialValue()
{
return initialValue; // ERROR 1
// undeclared identifier "initialValue"
}
的main.cpp
#include "some_header.h"
int main()
{
Interval<int> range(0,5);
CIRSDE<int, int> a (1, range, 3,3,3); //ERROR2
// variable CIRSDE<> is an abstract class
return 0;
}
答案 0 :(得分:1)
错误1:
template <typename T, typename R>
T CIRSDE<T,R> :: GetInitialValue()
{
return initialValue; // ERROR 1
// undeclared identifier "initialValue"
}
这是查找的问题。标识符initialValue
不依赖于模板参数,因此在第一次传递期间解析,在替换实际类型之前和不在基础中进行检查(在替换类型之前基本不知道!)< / p>
您可以通过SDE<T,R>::initialValue
之前的排位或使用this
进行排位来解决问题:
return this->initialValue;
错误2
CIRSDE<int, int> a (1, range, 3,3,3); //ERROR2
// variable CIRSDE<> is an abstract class
问题是基础有几个纯虚函数,你没有在CIRSDE
中提供定义。特别是:
virtual T GetDrift() = 0;
virtual T GetDiffusion() = 0;
请注意,派生类型中的以下内容不会覆盖,因为它们的签名不匹配:
T GetDrift(const T& t, const T& r);
T GetDiffusion(const T& t, const T& r);