2016-07-22 2 views
1

Я написал класс Event в качестве обертки вокруг функций обратного вызова, реализованный как std::function s. Это то, что он выглядит следующим образом:C++ - std :: function как параметр для функтора

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; 
}; 

Затем внутри другого класса, у меня есть экземпляр события:

class Control 
{ 
public: 
    Control(); 

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

Это, однако, не будет компилировать на VC++, генерируя ошибки C3646 (неизвестный спецификатор переопределения) и ошибка C4430 (отсутствующий спецификатор типа - предполагаемый int) для обоих обработчиков с более синтаксическими ошибками для myEvent2. Где я неправ?

+5

В будущем отправьте фактические ошибки. Несмотря на то, что вы не можете их понять, у них действительно есть полезная информация! – Yakk

ответ

1

Вы должны использовать {} синтаксис:

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

Demo

В синтаксисе для default member initializer является

member = value; 

или

member{value}; 

, но НЕ

member(value); // Invalid syntax 
+6

Можете ли вы объяснить * почему *? – Borgleader

+1

@erip: Ничего общего с стиранием типа, но с разрешенным синтаксисом для установки инициализатора элемента по умолчанию. см. [data_members_initialization] (http://en.cppreference.com/w/cpp/language/data_members#Member_initialization) – Jarod42

+0

@Borgleader: сообщение отредактировано, чтобы добавить небольшое объяснение. – Jarod42

2

Когда вы пишете

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

компилятор обрабатывает myEvent2 как функции-члена, а не конструктор вызова.

Смежные вопросы