2016-03-30 2 views
0

Я пытаюсь сохранить функцию обратного вызова в классе, поэтому я могу создавать разные экземпляры с различным обратным вызовом. К сожалению, stackoverflow заставляет меня писать больше бесполезных вещей, говоря, что мой пост - это в основном код. Однако я не вижу никаких проблем, которые мгновенно понимают мой вопрос, глядя на код ниже.Передача lambda как аргумент конструктора

Не могу понять, почему это не работает:

#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(); 
} 

Ошибка:

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

В то время как это делает:

#include <iostream> 
#include <functional> 

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

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

    A(q); 
} 

ответ

4

Синтаксис для передачи аргументов конструктора в объявление переменной:

A a(q); 

В целом, различные способы объявления переменных являются:

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

И с C++ 11 uniform initialization:

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

Не забывайте о равномерном инициализации: '' 'TypeName имяПеременной {};' '' и '' 'TypeName имяПеременной {arg1, arg2, ...};' '' –

+0

Спасибо, я буду добавьте это. – jtbandes

2

Правильный синтаксис для инициализации объекта a с параметром q является

A a(q); 

не

A(q) a; 
+0

omg, вот так глупо от меня :) спасибо. –

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