std::Funktion nicht zu unterscheiden, überladene Funktionen

Ich versuche zu verstehen, warum std::function ist nicht in der Lage zu unterscheiden zwischen überladenen Funktionen.

#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, function<void(int, int)> entsprechen kann nur eine dieser Funktionen, und doch gelingt es nicht. Warum ist das so? Ich weiß, ich kann dies umgehen, indem mit einem lambda-Ausdruck oder eine Funktion Zeiger auf die eigentliche Funktion und die Speicherung der Funktion Zeiger in Funktion. Aber warum funktioniert das nicht? Ist das nicht der Kontext klar, welche Funktion will ich gewählt werden? Bitte helfen Sie mir zu verstehen, warum das so ausfällt, wie ich bin nicht in der Lage zu verstehen, warum template-matching versagt in diesem Fall.

Den compiler-Fehler, dass ich auf clang für diese 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.

BEARBEITEN - neben MSalters " Antwort, ich habe einige suchen auf dieses forum und fand den genauen Grund, warum dies nicht gelingt. Ich bekam die Antwort von Nawaz Antwort in diesem post.

Habe ich die Kopie eingefügt werden aus seiner Antwort hier:

    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 also std::function<int(const std::string&)> funktioniert nicht, die Art und Weise funtype fun = test funktioniert oben?

Nun, die Antwort ist, weil std::function kann initialisiert werden mit einem Objekt, wie der Konstruktor ist templatized, die unabhängig von der template-argument übergeben std::function.

Die compiler fehlschlägt?
gcc 4.8 und clang und Visual Studio 2013. Ich kann nach der compiler-Fehler, wenn dies erforderlich ist, obwohl Sie nicht sehr freundlich.
compiler-Fehler sind in der Regel nicht freundlich, aber Wert posting, es ist seltsam, dem wird dies hier nicht eindeutig, fast so, als wenn die Art der Klasse A ist irgendwie angesehen, als das gleiche wie int, tritt der Fehler immer noch auftreten, wenn Sie erklären add wie doubles?
Ja. Es schlägt fehl, wenn ich die parameter-Typen zu verdoppeln, in der zweiten Funktion. Ich habe bearbeitet Sie die Frage, zählen die Fehler, ich bin immer auf clang.
ähnliche Frage und seine Antwort: stackoverflow.com/a/12500492/678093

InformationsquelleAutor MS Srikkanth | 2015-05-22

Schreibe einen Kommentar