2012-04-11 14 views
8

Ho una funzione di sovraccarico che voglio passare insieme avvolta in una funzione std ::. GCC4.6 non trova una "funzione di corrispondenza". Mentre ho trovato alcune domande qui le risposte non sono chiare come vorrei. Qualcuno potrebbe dirmi perché il seguente codice non può dedurre il sovraccarico corretto e come (elegantemente) lavorare intorno ad esso?Funzione di sovraccarico del capo tramite std :: function

int test(const std::string&) { 
    return 0; 
} 

int test(const std::string*) { 
    return 0; 
} 

int main() { 
    std::function<int(const std::string&)> func = test; 
    return func(); 
} 

risposta

17

Questa è una situazione ambigua.

Per disambiguare, utilizzare cast esplicito come:

typedef int (*funtype)(const std::string&); 

std::function<int(const std::string&)> func=static_cast<funtype>(test);//cast! 

Ora il compilatore sarebbe in grado di disambiguare la situazione, in base al tipo nel cast.

In alternativa, si può fare questo:

typedef int (*funtype)(const std::string&); 

funtype fun = test; //no cast required now! 
std::function<int(const std::string&)> func = fun; //no cast! 

Allora perché std::function<int(const std::string&)> non funziona il modo in cui funziona funtype fun = test di cui sopra?

Beh, la risposta è, perché std::function possono essere inizializzati con qualsiasi oggetto, come il suo costruttore viene templatized che è indipendente dell'argomento modello è stato passato a std::function.

+1

Si prega di utilizzare 'static_cast' al posto del cast vecchio stile. – Anonymous

+0

@Anonimo: Sì. Ma volevo farla breve. Comunque, l'ho modificato per far sembrare il C++ - ish! – Nawaz

+0

Che ironia: devi usare i puntatori di funzione per ottenere una funzione std ::, che è stata introdotta per allontanarti dai puntatori di funzione :) thx – abergmeier

Problemi correlati