2013-08-19 2 views
-1

PayOff는 추상 기본 클래스이며 CallPayOff 및 PutPayOff에서 파생됩니다. 호출 연산자는 기본 클래스의 순수 가상 함수로 정의되며 CallPayOff 및 PutPayoff는 자체 구현을 제공합니다.가상 호출 연산자를 사용하는 std :: transform에서 "전역 함수에 'this'포인터가 없습니다.

class PayOff 
{ 
public: 
    virtual double operator()(double spot)const = 0; 
    virtual ~PayOff(){} 
}; 

사람이 봐 주시겠습니까 :

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

+0

C++ 11은 어떻습니까? –

+0

죄송합니다. 이전 버전입니다. – user2696565

+0

예, "main"에서 transform을 호출합니다. – user2696565

답변

1

transform의 예상 내용을 말하지 않았습니다. 아마도 각각의 PayOff 객체를 어떤 값으로 호출 할 것입니다. 그 경우 펑이 있어야한다 : 과거에 갇혀없는 사람들을 위해

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

또는,

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

또는

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

대신 결합하려고를 this에있는, 전역 함수에서 존재하지 않습니다. 멤버 함수에서는 존재하지만, double을 기대하는 functor에 대한 인수로는 의미가 없습니다.

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

호출의 이름은 고개를 호출이 발생하는 장소에서 해결해야합니다. 귀하의 의견에 따라 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에서 대신 std::bindboost::bind를 사용할 수 있습니다 또는 당신을 사용할 수없는 경우 인수에 operator()을 호출 할 자신의 펑터 또는 어댑터 펑터를 만들 수 있습니다.

+0

코드가 작동하지 않습니다.'operator()'는'double' 인수를 취합니다. 바인딩 그 자체가 문제가 아니 었습니다. – filmor

+0

@ 필름 : 그 질문에 나중에 추가되었습니다. 코멘트를 주셔서 감사합니다. –

0

주 기능에서 변환을 호출하는 경우 this이 없습니다.

0

은 (위의 제안이 아닌 쁘)는 다음과 같이 두 배를 제공해야합니다으로 보이는 :

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

를 PS 나는 당신의 구문을 확인하지 않은하지만 기본적으로이 사전의 C +에서 수행하는 방법이다 +11 코드.