PayOff является абстрактным базовым классом, а CallPayOff и PutPayOff являются его производными. Оператор вызова определяется как чисто виртуальная функция в базовом классе, а CallPayOff и PutPayoff предоставляют свои собственные реализации.
vector<PayOff*> v;
v.push_back(new CallPayOff(20));
v.push_back(new PutPayOff(20));
vector<double> payVals;
payVals.reserve(v.size());
transform(v.begin(), v.end(), back_inserter(payVals), bind2nd(mem_fun(&PayOff::operator()),this));
Оператор звонка определяется как:
class PayOff
{
public:
virtual double operator()(double spot)const = 0;
virtual ~PayOff(){}
};
Может кто-нибудь, пожалуйста, посмотрите? Boost / C ++ 11 не вариант.
Вы не говорите, что вы ожидаете transform
сделать; по-видимому, это призвать каждого PayOff
объект на какое-то значение. В этом случае функтор должен быть:
bind2nd(mem_fun(&PayOff::operator()),some_value)
или, для тех, кто не застрял в прошлом,
[=](PayOff* p){(*p)(some_value;}}
или же
bind(&PayOff::operator(), _1, some_value);
Вместо этого вы пытаетесь связать this
которого в глобальной функции не существует. В функции-члене она существовала бы, но не имела бы смысла в качестве аргумента функтору, который ожидает double
,
transform(v.begin(), v.end(), payVals.begin(),
bind2nd(mem_fun(&PayOff::operator()),this));
Имена в звонке transform
должен быть найден и решен в месте, где происходит вызов. Который согласно вашему комментарию main
, внутри main
, вы не можете использовать this
,
Если у вас есть компилятор C ++ 11, вы можете выбрать лямбду или std::bind
:
std::transform(std::begin(v), std::end(v),
std::begin(payVals),
[](PayOff* p) { (*p)(value); });
std::transform(std::begin(v), std::end(v),
std::begin(payVals),
std::bind(&Payoff::operator(), _1, value); // using std::placeholders::_1
В C ++ 03 вы можете использовать boost::bind
вместо std::bind
или, если это не доступно, вы можете создать свой собственный функтор или функтор адаптера, который будет вызывать operator()
на аргумент.
Если вы вызываете преобразование из вашей основной функции, this
не существует.
Выглядит так, как вы должны предоставить double следующим образом (не пуантом, как предложено выше):
const double spot(99.);
transform(v.begin(), v.end(), payVals.begin(), bind2nd(mem_fun(&PayOff::operator()),spot));
PS
Я не проверял ваш синтаксис, но по сути это то, как это сделать в коде до-++ 11.