C++ std::transform with virtual call操作符抛出“全局函数没有‘this’指针”

C++ std::transform with virtual call操作符抛出“全局函数没有‘this’指针”,c++,stl,mem-fun,C++,Stl,Mem Fun,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.begi

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));
谁能看一下吗?Boost/C++11不是一个选项

transform(v.begin(), v.end(), payVals.begin(),  
          bind2nd(mem_fun(&PayOff::operator()),this));
转换调用中的名称必须在调用发生的位置查找和解析。根据你的评论,这是主要的。在main中,您不能使用此选项

如果您有C++11编译器,您可以选择使用lambda或std::bind:


在C++03中,您可以使用boost::bind而不是std::bind,或者如果std::bind不可用,您可以创建自己的functor或适配器functor来调用参数上的运算符。

如果您是从主函数调用transform,则这是不存在的。

您没有说希望转换做什么;大概是调用某个值上的每个PayOff对象。在这种情况下,函子应为:

bind2nd(mem_fun(&PayOff::operator()),some_value)
或者,对于那些没有陷入过去的人

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


而是尝试绑定到全局函数中不存在的。在成员函数中,它可能存在,但作为预期为双精度的函子的参数没有意义。

看起来应该按如下方式提供双精度,而不是如上所述的点:

const double spot(99.);
transform(v.begin(), v.end(), payVals.begin(),  bind2nd(mem_fun(&PayOff::operator()),spot));
PS
我没有检查您的语法,但本质上这是在c++11之前的代码中执行的操作。

对不起,只是旧版本。是的,我在main中调用transform。因此没有这个。大概,您希望变换调用具有某个值的每个对象;bind2nd的参数应该是这个值,而不是一个无意义的值。那么,为什么要在这里使用这个呢?这一个完全放错了位置,您需要绑定一个double,因为这是包装成员函数的第二个参数。您希望为每个元素执行什么?运算符具有什么双值?您的代码将无法运行,运算符采用双参数。装订本身不是这里的问题…@filmor:这后来被添加到问题中。修正了代码,谢谢你的评论。
[=](PayOff* p){(*p)(some_value;}}
bind(&PayOff::operator(), _1, some_value);
const double spot(99.);
transform(v.begin(), v.end(), payVals.begin(),  bind2nd(mem_fun(&PayOff::operator()),spot));