2013-03-05 28 views
0

我試圖編譯我在VS 2010中,編譯和GCC代碼工作,但我得到一個lambda表達式一個奇怪的錯誤:Lambda表達式,而不是與gcc

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 

出了什麼問題?

+3

順便說一句,你有一些UB。在這種情況下,您需要明確指定lambda的返回類型。 – chris 2013-03-05 15:18:10

+1

SSCCE如何? – 2013-03-05 15:19:13

+0

哪條線是哪條線?表明這一點。我在發佈的代碼中沒有看到任何'size_t&_T'。 – Nawaz 2013-03-05 15:19:33

回答

4

正如chris上面評論所看到的,帶有多個return語句的lambdas需要一個顯式的返回類型,可以這樣聲明,如->double

更重要的是,雖然違規行是由lambda捕獲的名爲t的變量。我原本雖然這是一個名字衝突,但正如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; 
    }; 
} 
+0

+1用於創建SSCCE。該代碼也無法在VS2012中編譯。 – Praetorian 2013-03-05 15:51:43

+0

看起來像STL使用了錯誤的名稱(我的意思是這個人和圖書館;) – odinthenerd 2013-03-05 15:52:52

+1

最小可重現的例子'int main(){unsigned T = 1,t = 1; auto f = [&](){return T && t;}; }'失敗,出現錯誤C2086:'unsigned int&_T':redefinition' – Praetorian 2013-03-05 15:59:18