2012-10-27 9 views
10

Ich versuche den folgenden Code aus here zu kompilieren, aber ich bekomme einen Kompilierfehler. Hat jemand irgendwelche Ideen, was könnte falsch sein?Std :: Funktion kompiliert nicht in VS2012

Der Code

#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); 
} 

Der Compiler-Fehler:

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> *' 

Dank.

+1

@jogojapan: 'print_add' zwei Argumente übernimmt, hat es eine _implicit_' this' Argument vom Typ 'Foo const *'. –

+0

@ K-ballo Richtig, sorry. – jogojapan

+0

@ K-ballo: 'std :: function' verwendet automatisch' std :: mem_fn', wenn der erste Parametertyp ein (Referenz/Zeiger auf) Klassentyp des Members ist. – Xeo

Antwort

7

Das sieht wie ein Fehler in VS2012 aus, ich habe einen Fehlerbericht here gemacht.

Vorerst folgende Arbeiten:

Edit: auf Xeo Vorschlag basiert edited std verwenden :: 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

Ihr Code ist irgendwie seltsam. Sie binden 'foo' und haben immer noch eine' std :: function '. Der einzige Grund dafür ist, dass 'std :: bind 'nicht benötigte Argumente verschluckt. Das richtige Äquivalent zu dem, was Sie in der Frage versuchen, wäre 'std :: mem_fn (& Foo :: print_add)'. – Xeo

+0

@Xeo Wann sollte man std :: bind vs std :: mem_fn verwenden? std :: mem_fn sieht einfacher aus. –

+0

'std :: mem_fn' ist ein einfacher Wrapper für Memberpointer, der ein Funktionsobjekt zurückgibt, das einen Zeiger oder eine Referenz auf die Klasse als ihren ersten Parameter und danach alle Parameter einer Memberfunktion (falls vorhanden) annimmt. 'std :: bind' dient zum Binden von Argumenten an eine Funktion. – Xeo

Verwandte Themen