Auch wenn es scheint, der Aufruf an fold_left
im folgenden Programm ist spezifisch genug, um das Argument der Vorlage Funktion abzuleiten, tritt ein Kompilierungsfehler aufgrund einer template argument deduction Fehler.Vorlage Argument Abzug Fehler
#include <valarray>
#include <functional>
template<class Input, class Output>
Output fold_left(Output zero, std::function<Output(Output,Input)> op, std::valarray<Input> data)
{
for (auto const& item : data) {
zero = op(zero, item);
}
return zero;
}
#include <iostream>
int main()
{
std::valarray<int> data { 1, 2, 3, 4, 5 };
std::cout << fold_left(0, std::plus<int>{}, data) << "\n";
}
main.cpp: In function 'int main()': main.cpp:17:66: error: no matching function for call to 'fold_left(int, std::plus<int>, std::valarray<int>&)' std::cout << fold_left/*<int,int>*/(0, std::plus<int>{}, data) << "\n"; ^ main.cpp:5:8: note: candidate: template<class Input, class Output> Output fold_left(Output, std::function<Output(Output, Input)>, std::valarray<_Tp>) Output fold_left(Output zero, std::function<Output(Output,Input)> op, std::valarray<Input> data) ^~~~~~~~~ main.cpp:5:8: note: template argument deduction/substitution failed: main.cpp:17:66: note: 'std::plus<int>' is not derived from 'std::function<Output(Output, Input)>' std::cout << fold_left/*<int,int>*/(0, std::plus<int>{}, data) << "\n"; ^
Das Minimalprogramm würde nur kompilieren, wenn fold_left
mit aufgerufen:
fold_left<int, int>(0, std::plus<int>{}, data);
Das fühlt sich für mich seltsam, da die Output
Template-Argument offensichtlich sein sollte, da wir eine bereitgestellt int
als erstes Argument (zero
); In ähnlicher Weise sollte das Template-Argument Input
korrekt abgeleitet werden, da wir ein std::valarray<int>
als drittes Argument (data
) bereitgestellt haben, das eine std::valarray<Input>
erwartet. Die Reihenfolge der Argumente in der Definition von fold_left
are not relevant.
Warum scheitert die Vorlage Argument Ableitung hier?
'std :: function' ist Schwergewicht dafür. Sie brauchen die Art der Löschung nicht. – chris
@chris du hast Recht, aber es hilft nicht;) – YSC