У меня есть несколько проблем с моими следующими классами. Когда я создаю объект типа «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;
}
Ошибка «недопустимая ссылка на нестатический член» говорит вам, что вы пытаетесь получить доступ к переменной или функции члена, как если бы она была статической.
Например, с MonteCarlo<T> :: stepsNumber
MonteCarlo<T>
part — это просто имя типа, а не его экземпляр.
Либо вам нужно изменить класс MonteCarlo, чтобы иметь статические члены.
Или же вам нужно создавать экземпляры. Например:
MonteCarlo<T> m;
m.stepsNumber;
Или, возможно, вы имели в виду MonteCarloSingleAsset
извлечь из MonteCarlo
, что значительно изменило бы ситуацию. Однако это не то, что делает ваш код в настоящее время.