Я создал глобальную функцию CallPrice (args). У меня есть класс EuropeanOption, и у меня есть функция класса CallPrice, которая должна вызывать глобальную функцию с помощью переменных из класса EuropeanOption и возвращать CallPrice. Я получаю сообщение об ошибке «глобальная область не имеет» CallPrice «.
Я думаю, что это общая проблема. Я искал другие темы, которые говорили, что добавление :: должно решить проблему, но это не работает для меня. Не могли бы вы определить причину ошибки? Нужно ли сделать это функцией друга или каким-то другим способом?
Спасибо!
Заголовок:
#ifndef EuropeanOption_HPP
#define EuropeanOption_HPP
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <boost/math/distributions/normal.hpp>
using namespace boost::math;
using namespace std;
namespace CLARK
{
struct EquityParms
{
double T; // years until expiry
double K; // strike price
double sig; // vol
double r; // risk free rate
double b; // cost of carry
};
// Global Call function
const double CallPrice(double T, double K, double sig, double r, double b, double EquityPrice);
class EuropeanOption
{
private:
double T; // years until expiry
double K; // strike price
double sig; // vol
double r; // risk free rate
double b; // cost of carry
double S; // current equity price
double ExactCallPrice;
public:
EuropeanOption(); // default constructor (empty)
EuropeanOption(const EquityParms& data, double EquityPrice); // constructor that sets parms
void copy(const EuropeanOption& source);
~EuropeanOption();
void init(const EquityParms& data, double EquityPrice); // initialize EquityParms
const double CallPrice(); // trying to call global function in this function
};
}
#endif
Источник:
#include "EuropeanOption_H.hpp"
namespace CLARK
{
const double CallPrice(double T, double K, double sig, double r, double b, double EquityPrice)
{// Global Function
double temp = sig * sqrt(T);
double d1 = (log(EquityPrice / K) + (r + (sig*sig) * 0.5) * T) / temp;
double d2 = d1 - temp;
normal_distribution<> myNormal(0,1);
return (EquityPrice * cdf(myNormal,d1)) - (K * exp((b - r) * T) * cdf(myNormal, d2));
}
EuropeanOption::EuropeanOption()
{// default constructor
cout << "Default constructor call" << endl;
}
EuropeanOption::EuropeanOption(const EquityParms& data, double EquityPrice)
{// constructor that sets parms
init(data, EquityPrice);
}
void EuropeanOption::copy(const EuropeanOption& source)
{
T = source.T;
K = source.K;
sig = source.sig;
r = source.r;
S = source.S;
b = source.b;
}
EuropeanOption::~EuropeanOption()
{
}
void EuropeanOption::init(const EquityParms& data, double EquityPrice)
{
T = data.T;
K = data.K;
sig = data.sig;
r = data.r;
S = EquityPrice;
b = data.b;
}
const double EuropeanOption::CallPrice()
{ // trying to call global function in this function
return ::CallPrice(T, K, sig, r, b, S); // the global scope has no "CallPrice" ???
}
}
CallPrice
находится в пространстве имен CLARK
, Так что постарайтесь
CLARK::CallPrice(/* ... */);
Вы объявили глобальный CallPrice
в пространстве имен CLARK
, Синтаксис ::CallPrice
пытается использовать функцию CallPrice
определяется в глобальном пространстве имен или в анонимном пространстве имен. Вместо этого используйте CLARK::CallPrice
,
Вы находитесь в пространстве имен CLARK:
return CLARK::CallPrice(T, K, sig, r, b, S);