2014-12-02 12 views
9

Hier ist meine Frage: ich einen Funktor definieren:Übergeben Sie anonymes Funktionsobjekt an std :: function?

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

dann verwende ich eine anonyme Funktors ein std :: function-Objekt zu erstellen, und das finde ich etwas seltsam. Hier ist mein Code:

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

Leider ist es falsch. Die Fehlermeldung lautet:

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

Allerdings, wenn ich meinen Code wie folgt zu ändern:

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

oder

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

Das Ergebnis stimmt. Also, warum ist es? Bitte hilf mir, es zu verstehen. Vielen Dank.

Antwort

13
Fun f(A()); 

Dies ist ein Fall der most-vexing parse. Es deklariert eine Funktion f, die eine Fun zurückgibt. Es nimmt einen Funktionszeiger als Argument und zeigt auf eine Funktion, die keine Argumente annimmt und eine A zurückgibt.

Es gibt ein paar Möglichkeiten, dies zu umgehen:

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 

Oder eines der Dinge, die Sie getan haben.

+0

Sie haben mich dazu geschlagen. Das meiste Ärger-Problem in der Tat. –

+0

Manchmal werden Begriffe in der Informatik in irreführender Weise benannt. Dies ist nicht einer dieser Zeiten. – Yakk

Verwandte Themen