2012-10-27 12 views
10

Sto cercando di compilare il seguente codice preso da here ma sto ottenendo un errore di compilazione. Qualcuno ha qualche idea su cosa potrebbe essere sbagliato?std :: la funzione non viene compilata in VS2012

Il codice

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

L'errore di compilazione:

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

Grazie.

+1

@jogojapan: 'print_add' accetta due argomenti, ha un _implicit_' this' argomento di tipo 'Foo const *' pure. –

+0

@ K-ballo Bene, mi dispiace. – jogojapan

+0

@ K-ballo: 'std :: function' usa automaticamente' std :: mem_fn' se il suo primo tipo di parametro è un (riferimento/puntatore al) tipo di classe del membro. – Xeo

risposta

7

Questo sembra un bug in VS2012, ho creato un bug report here.

Per ora le seguenti opere:

Modifica: a cura basati su suggerimento di Xeo di usare 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

Il tuo codice è abbastanza strano. Leghi 'pippo' e hai ancora una' std :: function '. L'unica ragione per cui questo funziona è perché 'std :: bind' inghiotte argomenti non necessari. La cosa corretta equivalente a ciò che stai provando nella domanda sarebbe usare 'std :: mem_fn (& Foo :: print_add)'. – Xeo

+0

@Xeo quando si dovrebbe usare std :: bind vs std :: mem_fn? std :: mem_fn sembra più semplice. –

+0

'std :: mem_fn' è un semplice wrapper per puntatori membri che restituisce un oggetto funzione che accetta un puntatore o un riferimento alla classe come primo parametro e ogni parametro da una funzione membro (se presente) dopo di ciò. 'std :: bind' è per gli argomenti di associazione a una funzione. – Xeo

Problemi correlati