2014-12-02 73 views
9

这里是我的问题: 我定义了一个函子:将匿名函数对象传递给std :: function?

class A { 
public: 
    int operator()(int a, int b) const{ 
    return a + b; 
    } 
}; 
typedef function<int (int, int)> Fun; 

然后我用一个匿名函子来创建一个std ::函数对象,我觉得有些奇怪。这里是我的代码:

Fun f(A()); 
f(3, 4); 

不幸的是这是错的。该错误信息是:

error: invalid conversion from ‘int’ to ‘A (*)()’ [-fpermissive] 
error: too many arguments to function ‘Fun f(A (*)())’ 

但是,当我改变我的代码如下:

A a; 
Fun f(a); 
f(3, 4); 

Fun f = A(); 
f(3, 4); 

结果是正确的。 那么,为什么呢?请帮助我理解它。谢谢。

回答

13
Fun f(A()); 

这是most-vexing parse的情况。它声明了一个函数f,它返回Fun。它将函数指针作为参数,指向不带参数的函数并返回A

有几种方法来解决这个问题:

Fun f{A()}; // Uniform-initialisation syntax 
Fun f{A{}}; // Uniform-initialisation on both objects 
Fun f((A())); // Forcing the initialiser to be an expression, not parameter list 

或你做的事情之一。

+0

你打败了我。最令人烦恼的解析问题的确如此。 – 2014-12-02 14:47:51

+0

有时候,计算机科学中的术语会以误导的方式命名。这不是其中之一。 – Yakk 2014-12-02 18:15:20

相关问题