std::使用虚拟呼叫操作员转换抛出"global functions do not have 'this' pointers"



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(){}
};

谁能看看?提升/C++11 不是一个选项。

transform(v.begin(), v.end(), payVals.begin(),  
          bind2nd(mem_fun(&PayOff::operator()),this));

必须在呼叫发生的位置查找和解析呼叫transform中的名称。根据您的评论,这是main.在main内部,您不能使用this

如果您有 C++11 编译器,您可以选择使用 lambda 或 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()

你没有说你期望transform做什么;大概是在某个值上调用每个PayOff对象。在这种情况下,函子应该是:

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

或者,对于那些没有停留在过去的人,

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

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

相反,您正在尝试绑定到全局函数中不存在的this。在成员函数中,它将存在,但作为期望double的函子的参数没有意义。

如果从主函数调用 transform,则不存在this

看起来您应该提供如下双精度(而不是上面建议的足尖(:

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

附言我没有检查过你的语法,但本质上这是在 c++11 之前的代码中如何做的。

最新更新