Sto cercando di capire perché std::function
non è in grado di distinguere tra funzioni sovraccariche.std :: function non riesce a distinguere le funzioni sovraccariche
#include <functional>
void add(int,int){}
class A {};
void add (A, A){}
int main(){
std::function <void(int, int)> func = add;
}
Nel codice mostrato sopra, function<void(int, int)>
può competere solo una di queste funzioni, eppure fallisce. Perché è così? So che posso aggirare questo problema usando una lambda o un puntatore a funzione della funzione effettiva e quindi memorizzando il puntatore funzione in funzione. Ma perché questo fallisce? Non è chiaro il contesto su quale funzione voglio essere scelta? Per favore aiutami a capire perché questo non funziona perché non sono in grado di capire perché la corrispondenza dei modelli fallisce in questo caso.
Gli errori del compilatore che ricevo su clang per questo sono i seguenti:
test.cpp:10:33: error: no viable conversion from '<overloaded function type>' to
'std::function<void (int, int)>'
std::function <void(int, int)> func = add;
^ ~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_03:1266:31: note:
candidate constructor not viable: no overload of 'add' matching
'std::__1::nullptr_t' for 1st argument
_LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_03:1267:5: note:
candidate constructor not viable: no overload of 'add' matching 'const
std::__1::function<void (int, int)> &' for 1st argument
function(const function&);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_03:1269:7: note:
candidate template ignored: couldn't infer template argument '_Fp'
function(_Fp,
^
1 error generated.
EDIT - Oltre alla risposta MSalters', ho fatto qualche ricerca su questo forum e ho trovato il motivo esatto per cui questo non riesce. Ho ricevuto la risposta dalla risposta di Nawaz in questo post.
ho copia incollato dalla sua risposta qui:
int test(const std::string&) {
return 0;
}
int test(const std::string*) {
return 0;
}
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 è templatized che è indipendente dell'argomento modello è stato passato a std::function
.
Quale compilatore non riesce? – EdChum
gcc 4.8, clang e Visual Studio 2013.Posso postare gli errori del compilatore se è necessario anche se non sono molto amichevoli. Gli errori del compilatore – Madhusudhan
di solito non sono amichevoli, ma vale la pena di postarlo, è strano che questo qui diventi ambiguo, quasi che il tipo di classe 'A' sia in qualche modo visto come' int', l'errore si verifica ancora se si dichiara 'aggiungi' come se fosse' double's? – EdChum