Von this Frage Ich habe ein gutes Verständnis von Funktoren (Funktionsobjekte); wie man sie initialisiert und anruft. Ich schrieb einen Code mit diesem für mein eigenes VerständnisWarum schlägt die Verwendung eines Funktionsobjektarguments in std :: transform fehl und erfordert stattdessen einen Lambda-Ausdruck
class Foo
{
private:
int x;
public:
Foo(int x) : x(x) {}
int operator()(int y) { return x + y; }
};
Foo poo(50);
int a = poo(50);
std::cout << a;
std::vector<int> vec(10);
std::vector<int> pec(10);
std::transform(vec.begin(), vec.end(), vec.begin(), poo(1));
zu spielen, um und erhalten die folgenden Kompilierungsfehler
Severity Code Description Project File Line Suppression State
Error C2064 term does not evaluate to a function taking 1 arguments
ich einige der Kommentare innerhalb der obigen Frage sah und versuchte stattdessen einen Lambda-Ausdruck
std::transform(vec.begin(), vec.end(), vec.begin(), [](Foo poo) {return poo(1); });
, die funktioniert, aber ich verstehe nicht, warum die akzeptierte Antwort std::transform(in.begin(), in.end(), out.begin(), add_x(1));
mit schlägt fehl. Warum muss ich einen Lambda-Ausdruck verwenden? Eine andere Antwort ist dasselbe, aber es wird immer noch zu einem Kompilierungsfehler führen. Warum das?
Es klingt wie ein Tippfehler. 'poo (1)' -> 'Foo (1)'. –
Ich denke, es ist eher ein Fall der etwas irreführenden Fehlermeldung, die Sie die Tatsache vermissen lässt, dass Sie auf etwas verweisen, das nicht existiert: 'poo'. –
'poo (1)' ist ein 'int'; wie die Fehlermeldung sagt, es ist keine Funktion, 1 Argument zu nehmen. 'Foo (1)' ist ein Funktionsobjekt mit einem 'operator()', der ein einzelnes Argument vom Typ 'int' akzeptiert. –