0

gcc でコンパイルして動作する VS 2010 でコードをコンパイルしようとしていますが、ラムダ式で奇妙なエラーが発生します。

   std::function<double (size_t level, size_t q)> doLevel = [&](size_t level, size_t q)
   {  //line 52
       double thisLevelP = density(q, data[level]);
       if(level==T-1) return thisLevelP;
       if(level==t-1) return  thisLevelP*A(q,state)*doLevel(level+1,state);
       double continuation = 0.0;
       for(size_t i=0; i<Q; ++i)
       {
           continuation += A(q, i)*doLevel(level+1, i);
       }
       return thisLevelP*continuation;
   };

エラーは次のとおりです。

Error   1   error C2086: 'size_t &_T' : redefinition    c:\users\ga1009\documents\phd\cpp\pmi\cpp\test\baumiterationtest.cpp    52
Error   2   error C2661: '`anonymous-namespace'::`anonymous-namespace'::<lambda1>::<lambda1>' : no overloaded function takes 8 arguments    c:\users\ga1009\documents\phd\cpp\pmi\cpp\test\baumiterationtest.cpp    52

なにが問題ですか?

4

1 に答える 1

4

上記の chris のコメントに見られるように、複数の return ステートメントを持つラムダには、 this のように宣言できる明示的な戻り値の型が必要->doubleです。

tさらに重要なのは、問題のある行は、ラムダによってキャプチャされる名前付きの変数です。私はもともとこれは名前の衝突だと思っていましたが、STLが正しく指摘しているように、1つが大文字であることを除いて同じ2つの名前で発生します。これは既知のコンパイラのバグであり、最新バージョンで修正されています。

double density(std::size_t, int)
{
    return 0;
}
double A(std::size_t, int)
{
    return 0;
}
int main(int argc, char *argv[])
{
    int data[] = {1,2,3};
    std::size_t T = 1;
    std::size_t t = 2;   //<<<<< change this name and it compiles
    std::size_t state = 3;
    std::size_t Q = 4;
    std::function<double (int,int)> doLevel = [&](int level, int q)->double
   { 
       double thisLevelP = density(q, data[level]);
      if(level==T-1) 
           return thisLevelP;
      if(level==t-1) 
           return  thisLevelP*A(q,state)*doLevel(level+1,state);
       double continuation = 0.0;
       for(size_t i=0; i<Q; ++i)
       {
           continuation += A(q, i)*doLevel(level+1, i);
       }
       return thisLevelP*continuation;
   };
}
于 2013-03-05T15:45:29.087 に答える