2016-07-22 5 views
1

Ich schrieb eine Event Klasse als Wrapper um Callback-Funktionen, implementiert als std::function s. Dies ist, wie es aussieht:C++ - std :: Funktion als Parameter für einen Funktor

class Event 
{ 
public: 
    Event() : default_handler([]() {}); 
    Event(const std::function<void()> handler) : default_handler(handler); 

    void SetHandler(std::function<void()> handler) 
    { 
     custom_handler = handler; 
    } 

    void operator()(void) 
    { 
     default_handler(); 
     custom_handler(); 
    } 

private: 
    const std::function<void()> default_handler; 
    std::function<void()> custom_handler; 
}; 

Dann in einer anderen Klasse, ich habe eine Instanz einer Event:

class Control 
{ 
public: 
    Control(); 

//Should call constructor Event() 
    Event myEvent1; 
//Should call constructor Event(std::function<void()>) 
    Event myEvent2([]() {/*do stuff... */}) 
}; 

Dies wird jedoch kompiliert nicht auf VC++, Erzeugen von Fehlern C3646 (Unbekannter Override-Spezifizierer) und Fehler C4430 (fehlender Typspezifizierer - int vorausgesetzt) ​​für beide Handler, mit mehr Syntaxfehlern für myEvent2. Was habe ich falsch gemacht?

+5

In Zukunft die tatsächlichen Fehler veröffentlichen. Trotz der Tatsache, dass Sie sie vielleicht nicht verstehen, haben sie tatsächlich nützliche Informationen! – Yakk

Antwort

1

sollten Sie verwenden {} Syntax:

Event myEvent2{[]() {/*do stuff... */}}; 

Demo

Als Syntax für default member initializer ist

member = value; 

oder

member{value}; 

aber NICHT

member(value); // Invalid syntax 
+6

Können Sie erklären warum? – Borgleader

+1

@erip: Nichts mit dem Löschen von Typen zu tun, aber mit der erlaubten Syntax, um den Standard-Member-Initialisierer zu setzen. siehe [data_members_initialization] (http://en.cppreference.com/w/cpp/language/data_members#Member_initialization) – Jarod42

+0

@Borgleader: Beitrag bearbeitet, um wenig Erklärung hinzuzufügen. – Jarod42

2

Wenn Sie schreiben

Event myEvent2([]() {/*do stuff... */}); 

Compiler myEvent2 als Member-Funktion, nicht Konstruktoraufruf behandelt.

Verwandte Themen