模板继承和抽象类

时间:2014-06-22 19:30:55

标签: c++ templates inheritance abstract-class

以下课程有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;
 }

1 个答案:

答案 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);