Also, ich habe ein Verfahren und seine Überlastung für eine Klasse, wie folgt geschrieben:Compiler nicht Typen abzuleiten bei der Verwendung von std :: function
bool my_for_each(someIterator begin, someIterator end, bool (*_lambda)(someIterator));
void my_for_each(someIterator begin, someIterator end, void (*_lambda)(someIterator));
Wie Sie sehen können, der einzige Unterschied ist die Unterschrift eine übergebene Funktion, dh ihr Rückgabetyp. Obwohl der Code funktioniert oben völlig in Ordnung, wenn ich es nennen:
my_for_each(iteratorBegin, iteratorEnd, [](someIterator) {; }); // calls void version
my_for_each(iteratorBegin, iteratorEnd, [](someIterator)->bool {return false; }); // calls bool version
..., wenn ich die my_for_each Funktion schreiben, wie folgt:
bool my_for_each(someIterator begin, someIterator end, std::function<bool(someIterator)> _lambda);
void my_for_each(someIterator begin, someIterator end, std::function<void(someIterator)> _lambda);
Der Code nicht kompilieren, wenn ich die Funktion aufrufen auf die gleiche Weise (C2668 mehrdeutiger Aufruf der überladenen Funktion). Obwohl, wenn ich die Funktion manuell gewirkt habe:
my_for_each(iteratorBegin, iteratorEnd, static_cast<std::function<void(someIterator)>>([](someIterator) {; })); //calls void version
my_for_each(iteratorBegin, iteratorEnd, static_cast<std::function<bool(someIterator)>>([](someIterator) -> bool { return false; })); //calls bool version
Der Code funktioniert einwandfrei. Also frage ich mich nur:
- Warum ist normale Funktion Zeiger Typ Abzug "stärker" als die Standard-Vorlage eins?
- Gibt es eine Art Workaround, um die allgemeinere Version zu verwenden, während der Parameter nicht manuell übergeben wird?
Der Compiler ist VS2015.
Dank und einen schönen Tag!
@ FrançoisAndrieux fixiert, nur ein Übertragungsfehler – Alfaix
Was ist die Bedeutung der Rückgabewerte für die 'my_for_each' Funktionen? –
Es scheinen zwei Iteratoren zu sein, die einen Bereich bilden, und eine Funktion, die einen Iterator akzeptiert und etwas tut. Ich bin mir nicht sicher, was mit all den Bool's in der zweiten Version gemacht wird (vermutlich entweder an und oder). –