2011-10-19 1 views
5

私は、次の簡略化のシナリオがあります。構文エラー

1>test.cpp(16): error C2059: syntax error : ')' 
1>   test.cpp(23) : see reference to class template instantiation A<T>' being compiled 

template< typename T> 
struct A 
{ 
    A() : action_([&](const T& t) { }) 
    {} 

private: 
    boost::function< void(const T&)> action_; 
}; 

のVisual C++ 2010でコンパイルする、それは私にaction_の建設で構文エラーを与えるが奇妙なのは、テンプレートパラメータを持たない同じ例がちょうど良いコンパイルであることです。

struct A 
{ 
    A() : action_([&](const int& t) { }) 
    {} 

private: 
    boost::function< void(const int&)> action_; 
}; 

私はこの問題への1つの回避策は、以下のコードのように、代わりに初期化リストの、コンストラクタ本体にaction_の初期化を移動させることであることを知っている:

template< typename T> 
struct A 
{ 
    A() 
    { 
    action_ = [&](const T& t) { }; 
    } 

private: 
    boost::function< void(const T&)> action_; 
}; 

...しかし、私は、このような回避策を避けたいです。

誰もこのような状況に遭遇しましたか?このような構文エラーと呼ばれる説明/解決策はありますか?

+0

FWIWは、G ++ 4.6.1で警告なしでコンパイルします。 –

+0

これはVisual C++ 2010に固有です。 –

答えて

1

Visual C++ 2010でlambdaの実装が壊れていますか?それは説明のための私の最高の推測です。

しかし、参照によって範囲変数をキャプチャすることは、このシチュエーションで何をしているのか興味をそそられています...何もありません。

+0

問題を理解するために、簡略化されたコードです。実際のケースでは、一部のデータメンバーにアクセスするスコープを取得する必要があります(宣言されているため、action_メンバーの前に初期化されています)。私はまた、ラムダの悪い実装を疑う。 –

+0

'[&]'は 'this'をキャプチャし、それはすべてのメンバ変数(それ自身を含む)を意味する。 – spraff