2016-03-30 16 views
0

コールバック関数をクラスに格納しようとしているため、異なるコールバックを使用して異なるインスタンスを作成できます。残念なことに、stackoverflowは私のポストが主にコードだと言って、無駄なものを書くよう強制します。しかし、私はすぐに私の質問を下記のコードを見て理解するのにトラブルが表示されません。コンストラクタ引数としてラムダを渡します。

これが動作しない理由を理解することはできません:

#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

にコンストラクタの引数を渡すための構文変数宣言は次のとおりです。

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

均一な初期化を忘れないでください: '' '型名variableNameに{};' ''と '' '型名variableNameに{arg1に、ARG2、...};' '' –

+0

おかげで、I'LLそれを加えなさい。 – jtbandes

2

パラメータq物体aを初期化するための正しい構文は

あります
A a(q); 

not

A(q) a; 
+0

omg、私の愚かなthats :)ありがとう。 –

関連する問題