Проблема при доступе к унаследованным членам из класса шаблона

У меня есть несколько проблем с моими следующими классами. Когда я создаю объект типа «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;
}

-4

Решение

Ошибка «недопустимая ссылка на нестатический член» говорит вам, что вы пытаетесь получить доступ к переменной или функции члена, как если бы она была статической.

Например, с MonteCarlo<T> :: stepsNumber MonteCarlo<T> part — это просто имя типа, а не его экземпляр.

Либо вам нужно изменить класс MonteCarlo, чтобы иметь статические члены.

Или же вам нужно создавать экземпляры. Например:

MonteCarlo<T> m;
m.stepsNumber;

Или, возможно, вы имели в виду MonteCarloSingleAsset извлечь из MonteCarlo, что значительно изменило бы ситуацию. Однако это не то, что делает ваш код в настоящее время.

0

Другие решения


По вопросам рекламы [email protected]