我的以下课程有一些问题。当我创建一个“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;
}
答案 0 :(得分:0)
错误“非法引用非静态成员”告诉您,您正在尝试访问成员变量或函数,就好像它是静态的一样。
例如,对于MonteCarlo<T> :: stepsNumber
,MonteCarlo<T>
部分只是一个类型的名称,而不是它的实际实例。
您需要将MonteCarlo类更改为具有静态成员。
否则你需要创建实例。例如:
MonteCarlo<T> m;
m.stepsNumber;
或许您的意思是MonteCarloSingleAsset
来自MonteCarlo
,这会显着改变这种情况。但是,这不是您的代码目前正在做的事情。