5

次のように、コンパイル時にファンクターの配列を作成しようとしています: (完全なファイル):

#include <functional>
using namespace std;

function< float( float tElevation, float pAzimuth )> colorFunctions[] = {
  []( float tElevation, float pAzimuth ) -> float {
    return 2.0f ;
  },
} ;

int main()
{
}

それはうまくいきます。しかし、ファンクター ブロック内にローカルを作成しようとすると、次のようになります。

function< float( float tElevation, float pAzimuth )> colorFunctions[] = {
  []( float tElevation, float pAzimuth ) -> float {
    float v = 2.0f ;
    return v ;
  },
} ;

Error 1 error C1506: unrecoverable block scoping error が表示される

これらのブロック内でローカルを宣言するにはどうすればよいですか? うまくいかないようです。

4

2 に答える 2

0

これは MSVC 2010 SP1 で再現できます。VS10 は、ラムダとスコープに関するいくつかの問題で知られています。私はたくさん試しましたが、美しいものは何も見つかりませんでした。初期化のオーバーヘッドが多少ありますが、それ以外は意図したとおりに機能する、醜い、醜い回避策:

#include <functional>
#include <boost/assign/list_of.hpp>
#include <vector>
using namespace std;

typedef function< float( float tElevation, float pAzimuth )> f3Func;
vector<f3Func const> const colorFunctions = boost::assign::list_of(
  f3Func([]( float /*tElevation*/, float /*pAzimuth*/ ) -> float {
    float v = 2.0f ;
    return v ;
  }))
  ([](float a, float b) -> float {
    float someFloat = 3.14f;
    return a*b*someFloat;
  })
;

#include <iostream>

int main()
{
  cout << colorFunctions[1](0.3f,0.4f) << '\n';
}
于 2012-11-21T10:17:07.113 に答える
-1

次の行を使用して、ubuntu 12.04 で次のコードをコンパイルしました:
g++-4.7 -std=c++0x main.cpp
そして、正常に動作しました。どのプラットフォームとどのコンパイラを使用していますか?

#include <iostream>
#include <functional>

using namespace std;

function<float (float,float)> funcs[] = {
    [] (float a, float b) -> float {
        float c = 2.0f;
        return c;
    }
};

int main() {
    std::cout << funcs[0](1,2) << std::endl;
}
于 2012-08-11T14:59:22.043 に答える