2012-10-27 19 views
10

Próbuję skompilować następujący kod pobrany z here, ale otrzymuję błąd kompilacji. Czy ktoś ma jakieś pomysły, co może być nie tak?std :: funkcja nie kompilująca się w VS2012

Kod

#include <iostream> 
#include <functional> 

struct Foo { 
    Foo(int num) : num_(num) {} 
    void print_add(int i) const { std::cout << num_+i << '\n'; } 
    int num_; 
}; 


int main() 
{ 
    // store a call to a member function 
    std::function<void(const Foo&, int)> f_add_display = &Foo::print_add; 
    Foo foo(314159); 
    f_add_display(foo, 1); 
} 

Błąd kompilacji:

Error 1 error C2664: 'std::_Func_class<_Ret,_V0_t,_V1_t>::_Set' : 
cannot convert parameter 1 from '_Myimpl *' to 'std::_Func_base<_Rx,_V0_t,_V1_t> *' 

Dzięki.

+1

@jogojapan: 'print_add' przyjmuje dwa argumenty, ma _implicit_' this' również argument typu 'Foo const *'. –

+0

@ K-ballo Racja, przepraszam. – jogojapan

+0

@ K-ballo: 'std :: function' automatycznie używa' std :: mem_fn', jeśli jego pierwszym typem parametru jest (referencja/wskaźnik do) typ klasy elementu. – Xeo

Odpowiedz

7

To wygląda jak błąd w VS2012, zrobiłem zgłoszenie błędu here.

Na razie następujące prace:

EDIT: edytowane na podstawie sugestii Xeo, aby wykorzystać std :: mem_fn

#include <iostream> 
#include <functional> 

struct Foo { 
    Foo(int num) : num_(num) {} 
    void print_add(int i) const { std::cout << num_+i << '\n'; } 
    int num_; 
}; 

int main() 
{ 
    // store a call to a member function 
    std::function<void(const Foo&, int)> f_add_display = std::mem_fn(&Foo::print_add); 
    Foo foo(314159); 
    f_add_display(foo, 1); 
} 
+2

Twój kod jest trochę dziwny. Wiążesz 'foo' i nadal masz' std :: function '. Jedynym powodem tego jest to, że 'std :: bind' pochłania niepotrzebne argumenty. Odpowiednim odpowiednikiem tego, co próbujesz w pytaniu, byłoby użycie 'std :: mem_fn (& Foo :: print_add)'. – Xeo

+0

@Xeo, kiedy należy użyć std :: bind vs std :: mem_fn? std :: mem_fn wygląda prościej. –

+0

'std :: mem_fn' jest prostym opakowaniem dla wskaźników członków, który zwraca obiekt funkcji, który pobiera wskaźnik lub odwołanie do klasy jako pierwszego parametru i każdego parametru z funkcji składowej (jeśli jest) po tym. 'std :: bind' służy do wiązania argumentów funkcji. – Xeo