从模板类访问继承成员的问题

时间:2014-06-30 22:57:25

标签: c++ templates montecarlo

我的以下课程有一些问题。当我创建一个“MonteCarloSingleAsset”类型的对象并将其应用于方法“GetPrice()”时,我得到了这个:

copy \ pricinglib \ montecarlosingleasset.h(81):错误C2597:非法引用非静态成员'MonteCarlo :: stepsNumber'

copy \ pricinglib \ montecarlosingleasset.h(85):错误C2597:非法引用非静态成员'MonteCarlo :: N'

copy \ pricinglib \ montecarlosingleasset.h(85):错误C3867:'MonteCarlo :: N':函数调用缺少参数列表;使用'& MonteCarlo :: N'创建指向成员的指针

提前感谢您的帮助。

在MonteCarlo.h中

#include <vector>
#include <cmath>
#include <string>



using namespace std;

template<typename T>
class MonteCarlo
{
   public:
        virtual ~MonteCarlo(){};

        MonteCarlo(unsigned long& _N,   unsigned long& _stepsNumber );

   protected:     
          T GetDiscountFactor(const double& r, const double& T);

          unsigned long N;  // num of sim
          unsigned long stepsNumber;  // steps for sde discretisation
        ;
 };

 template<typename T>
 T MonteCarlo<T> :: GetDiscountFactor(const double& r, const double& T) 
 {
    return exp(-r*T);
 }

 template<typename T>
 MonteCarlo<T> :: MonteCarlo(unsigned long& _N,   unsigned long& _stepsNumber)
 {
     N = _N;
     stepsNumber = _stepsNumber;
 }

在MonteCarloSingleAsset.h

#include "MonteCarlo.h"


template<typename T, char R>   
class MonteCarloSingleAsset
{
      public:


        T GetPrice(SingleAssetOption& option);

        MonteCarloSingleAsset(const unsigned long& _N, 
                             const string& SDEType,
                              const string& SDESimulType,
                               const unsigned long& _stepsNumber = 25);

        virtual ~MonteCarloSingleAsset(){};

      protected:
           string SDEType, SDESimulType; 


};

template<typename T, char R>
MonteCarloSingleAsset<T,R> :: MonteCarloSingleAsset(const unsigned long& _N, 
                                         //  const string& _randType, 
                                                const string& _SDEType,
                                                const string& _SDESimulType,
                                                const unsigned long& _stepsNumber)      

  :  MonteCarlo<T>(_N, _stepsNumber)

  {
     SDEType = _SDEType;  // GBM, VAS, MER, CIR
     SDESimulType = _SDESimulType; // EUMAR, MIL = milstein
  }


template<typename T, char R>
T MonteCarloSingleAsset<T,R> ::  GetPrice(SingleAssetOption& option)
{


    T sum = 0.0;
    T payOff = 0.0;
    vector<T> path;
    vector<T> rand;
    Interval<T> range(0.0, option.GetT());

    BasicMethod<T> randGen(1);

    GBMSDE<T> sde(option.GetS(), range, option.GetR() , option.GetVol());



    EulerMaruyamaScheme simulator(MonteCarlo<T> :: stepsNumber);


     for (unsigned long i = 1; i <= MonteCarlo<T> :: N ; i++)
     {
        rand = randGen.GetRandomVector( MonteCarlo<T> :: stepsNumber);
        path = simulator.SimPath(sde,rand);
        payOff = option.GetPayOff(path); 
        sum += payOff;
     }    

      double disFact = MonteCarlo<T> :: GetDiscountFactor(option.GetR(), option.GetT());

      return (1 / MonteCarlo<T> :: N )*disFact*sum; 
 }

1 个答案:

答案 0 :(得分:0)

错误“非法引用非静态成员”告诉您,您正在尝试访问成员变量或函数,就好像它是静态的一样。

例如,对于MonteCarlo<T> :: stepsNumberMonteCarlo<T>部分只是一个类型的名称,而不是它的实际实例。

您需要将MonteCarlo类更改为具有静态成员。

否则你需要创建实例。例如:

MonteCarlo<T> m;
m.stepsNumber;

或许您的意思是MonteCarloSingleAsset来自MonteCarlo,这会显着改变这种情况。但是,这不是您的代码目前正在做的事情。