我的以下类(class)有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;
 }

最佳答案


 template <typename T, typename R>
 T CIRSDE<T,R> :: GetInitialValue()
 {
       return  initialValue;     // ERROR 1
       // undeclared identifier "initialValue"
 }

这是查找问题。标识符initialValue不依赖于模板参数,因此在替换实际类型之前和不检入基数的情况下在第一次遍历期间就进行了解析(直到您替换类型才知道基数!)

您可以通过像在SDE<T,R>::initialValue之前一样进行排位赛或通过使用this来解决此问题:
       return this->initialValue;


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

关于c++ - 模板继承和抽象类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24354919/

10-12 15:02