std :: transform с оператором виртуального вызова: «глобальные функции не имеют указателей» this «& quot;

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 не вариант.

-1

Решение

Вы не говорите, что вы ожидаете transform сделать; по-видимому, это призвать каждого PayOff объект на какое-то значение. В этом случае функтор должен быть:

bind2nd(mem_fun(&PayOff::operator()),some_value)

или, для тех, кто не застрял в прошлом,

[=](PayOff* p){(*p)(some_value;}}

или же

bind(&PayOff::operator(), _1, some_value);

Вместо этого вы пытаетесь связать this которого в глобальной функции не существует. В функции-члене она существовала бы, но не имела бы смысла в качестве аргумента функтору, который ожидает double,

1

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

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() на аргумент.

2

Если вы вызываете преобразование из вашей основной функции, this не существует.

0

Выглядит так, как вы должны предоставить double следующим образом (не пуантом, как предложено выше):

const double spot(99.);
transform(v.begin(), v.end(), payVals.begin(),  bind2nd(mem_fun(&PayOff::operator()),spot));

PS
Я не проверял ваш синтаксис, но по сути это то, как это сделать в коде до-++ 11.

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