2016-03-30 17 views
0

Bir geri arama işlevini bir sınıfta depolamaya çalışıyorum, bu yüzden farklı geri çağrılarla farklı örnekler oluşturabilirim. Ne yazık ki, stackoverflow daha fazla işe yaramaz şeyler yazmamı zorluyor. Ancak, aşağıdaki kodu inceleyerek sorunumu anında anlayamıyorum.lambda bir yapıcı argümanı olarak geçen

Bu işe yaramazsa anlayamıyorum:

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

Hata:

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

yapar iken:

#include <iostream> 
#include <functional> 

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

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

    A(q); 
} 

cevap

4

bir de yapıcı argümanları geçirilmesi için sözdizimi Değişken bildirimi:

A a(q); 

Daha genel olarak, değişken ilan farklı yolları vardır:

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

ve C++ 11 uniform initialization:

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

üniforma başlatma unutmayın: '' typename variableName {} '; typename variableName' '' ve '' '{arg1, arg2, ...};' '' –

+0

sayesinde, ben olacak bunu ekle. – jtbandes

2

parametresi olan bir nesne a başlatılması için doğru sözdizimi q

olduğu
A a(q); 

A(q) a; 
+0

omg, bu çok aptal :) teşekkürler. –

İlgili konular