2010-02-20 14 views
67

Poniższy kod powoduje, że cl.exe ulega awarii (MS VS2005).
Próbuję użyć doładowania wiążą się utworzyć funkcję do wywołuje metodę MojaKlasa:Jak użyć wiązania zwiększającego z funkcją składową

#include "stdafx.h" 
#include <boost/function.hpp> 
#include <boost/bind.hpp> 
#include <functional> 

class myclass { 
public: 
    void fun1()  { printf("fun1()\n");  } 
    void fun2(int i) { printf("fun2(%d)\n", i); } 

    void testit() { 
     boost::function<void()> f1(boost::bind(&myclass::fun1, this)); 
     boost::function<void (int)> f2(boost::bind(&myclass::fun2, this)); //fails 

     f1(); 
     f2(111); 
    } 
}; 

int main(int argc, char* argv[]) { 
    myclass mc; 
    mc.testit(); 
    return 0; 
} 

Co robię źle?

Odpowiedz

89

Użyj następującego zamiast:

boost::function<void (int)> f2(boost::bind(&myclass::fun2, this, _1)); 

ten przesyła pierwszy parametr przekazywany do obiektu funkcji do funkcji przy użyciu Place-uchwyty - trzeba powiedzieć Boost.Bind jak obsługiwać parametry. Z twoją ekspresją spróbowałbyś zinterpretować to jako funkcję członka, nie biorąc żadnych argumentów.
Zobacz np. here lub here dla typowych wzorców użytkowania.

Zauważ, że VC8s cl.exe regularnie ulega awarii na Boost.Bind nadużyć - w razie wątpliwości skorzystać z test-sprawę z GCC i prawdopodobnie będzie uzyskać dobre wskazówki jak szablon Parametry oprawę -internals zostały tworzony z czy czytasz wynik.

+0

Możesz uzyskać pomoc dotyczącą tego http://stackoverflow.com/questions/13074756/how-to-avoid-static-member-function-when-using-gsl-with-c? jest podobny, ale 'std :: function' daje błąd –

+0

Dziękuję, to jest trochę mylące, ale twoja odpowiedź uratowała mi bekon! – portforwardpodcast

Powiązane problemy