2016-03-30 20 views
0

Ich versuche, eine Rückruffunktion in einer Klasse zu speichern, damit ich verschiedene Instanzen mit unterschiedlichen Rückruf erstellen kann. Unglücklicherweise zwingt mich stackoverflow dazu, mehr nutzloses Zeug zu schreiben und sagt, dass mein Beitrag hauptsächlich Code ist. Jedoch sehe ich keine Probleme, meine Frage sofort zu verstehen, indem ich den Code unten anschaue.Übergabe von Lambda als Konstruktorargument

Kann nicht verstehen, warum dies nicht funktioniert:

#include <iostream> 
#include <functional> 

class A { 
    public: 
     A(std::function<void()> lambda) : lambda_{lambda} {}; 
     void Run() { lambda_(); }; 
    private: 
     std::function<void()> lambda_; 
}; 

auto main() -> int { 
    auto q = []{};  
    A(q) a;                                                   
    a.Run(); 
} 

Fehler:

1.cpp:15:10: error: expected ‘;’ before ‘a’ 
    A(q) a; 
     ^

Während dies tut:

#include <iostream> 
#include <functional> 

void A(std::function<void()> lambda) { 
    lambda(); 
}; 

auto main() -> int { 
    auto q = []{}; 

    A(q); 
} 

Antwort

4

Die Syntax für Konstruktorargumente in einem vorübergehenden Variablendeklaration ist:

A a(q); 

Allgemeiner die verschiedenen Möglichkeiten von Variablen zu erklären sind:

TypeName variableName; // no arguments 
TypeName variableName(); // WRONG: this is a function declaration 
TypeName variableName(arg1, arg2, ...);

Und mit C++ 11 uniform initialization:

TypeName variableName{}; // no arguments 
TypeName variableName{arg1, arg2, ...}; 
+1

Sie über einheitliche Initialisierung nicht vergessen: '' 'Type-Name Variablenname {};' '' und '' 'Type-Name Variablenname {arg1, arg2, ...};' '' –

+0

Danke, werde ich füge das hinzu. – jtbandes

2

Die korrekte Syntax zur Initialisierung eines Objekts a mit dem Parameter q ist

A a(q); 

nicht

A(q) a; 
+0

omg, das ist so dumm von mir :) danke. –

Verwandte Themen