Ich versuche zu verstehen, warum std::function
nicht in der Lage ist, zwischen überladenen Funktionen zu unterscheiden.std :: function kann überladene Funktionen nicht unterscheiden
#include <functional>
void add(int,int){}
class A {};
void add (A, A){}
int main(){
std::function <void(int, int)> func = add;
}
Im Code oben gezeigt, kann function<void(int, int)>
nur eine dieser Funktionen entsprechen und doch scheitert es. Warum ist das so? Ich weiß, dass ich das umgehen kann, indem ich einen Lambda oder einen Funktionszeiger auf die tatsächliche Funktion verwende und den Funktionszeiger dann in Funktion speichere. Aber warum scheitert das? Ist der Kontext nicht klar, für welche Funktion ich ausgewählt werden möchte? Bitte helfen Sie mir zu verstehen, warum dies fehlschlägt, da ich nicht verstehen kann, warum in diesem Fall das Vorlagen-Matching fehlschlägt.
Die Compiler-Fehler, die ich für diese auf Klirren erhalten sind wie folgt:
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 - Neben MSalters' Antwort, ich auf diesem Forum einige der Suche tat und den genauen Grund gefunden, warum dies nicht gelingt. Ich habe die Antwort von Nawaz Antwort in dieser post bekommen.
Ich habe Kopie hier aus seiner Antwort eingefügt:
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!
warum So std::function<int(const std::string&)>
nicht die Art und Weise nicht funktionieren funtype fun = test
oben funktioniert?
Nun, die Antwort ist, weil std::function
kann mit jedem Objekt initialisiert werden, als Konstruktor templatized, die von der Vorlage Argumente unabhängig Sie std::function
weitergegeben.
Welcher Compiler schlägt fehl? – EdChum
gcc 4.8, clang und Visual Studio 2013.Ich kann die Compilerfehler veröffentlichen, wenn das erforderlich ist, obwohl sie nicht sehr freundlich sind. – Madhusudhan
Compiler-Fehler sind in der Regel nicht freundlich, aber es lohnt sich, es zu veröffentlichen, es ist seltsam, was hier mehrdeutig wird, fast so, als ob der Typ der Klasse 'A' irgendwie als 'int' betrachtet wird, tritt der Fehler immer noch auf, wenn Sie erklären 'add' als' double's? – EdChum