从this问题我对functors(函数对象)有了很好的理解;如何初始化并调用它们。我写了一些代码,使这个玩弄我自己的理解为什么在std :: transform中使用函数对象参数失败并且需要lambda表达式而不是
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));
,并收到以下编译错误
Severity Code Description Project File Line Suppression State
Error C2064 term does not evaluate to a function taking 1 arguments
我看了上面的问题中的一些评论,并试图lambda表达式代替
std::transform(vec.begin(), vec.end(), vec.begin(), [](Foo poo) {return poo(1); });
其作品,但为什么公认的答案使用std::transform(in.begin(), in.end(), out.begin(), add_x(1));
我不明白失败。为什么我必须使用lambda表达式?另一个答案是做同样的事情,但它仍然会导致编译错误。这是为什么?
这听起来像一个错字。 'poo(1)' - >'Foo(1)'。 –
我认为这更多的是误导性的错误信息,使你错过了你引用了一些不存在的事实:'poo'。 –
'poo(1)'是一个'int';如错误信息所示,它不是一个带1个参数的函数。 'Foo(1)'是一个带有'operator()'的函数对象,它接受一个'int'类型的单个参数。 –