0

我正在尝试在 VS 2010 中编译可以在 gcc 中编译和工作的代码,但是在 lambda 表达式上出现了一个奇怪的错误:

   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 语句的 lambdas 需要一个可以像这样声明的显式返回类型->double

更重要的是,尽管有问题的行是t被 lambda 捕获的命名变量。我最初虽然这是一个名称冲突,但正如 STL 正确指出的那样,除了一个是大写字母外,任何两个相同的名称都会发生这种情况。这是一个已知的编译器错误,已在最新版本中修复。

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 回答