2013-03-05 2 views
0

내가 컴파일 gcc가 작동 VS 2010 년 내 코드를 컴파일하려고를 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가 있습니다. 이 경우 람다의 반환 형식을 명시 적으로 지정해야합니다. – chris

+1

SSCCE는 어떻습니까? –

+0

어떤 라인이 어떤 라인입니까? 그것을 나타냅니다. 게시 된 코드에'size_t & _T '가 표시되지 않습니다. – Nawaz

답변

4

chris가 위의 주석에서 볼 수 있듯이 여러 개의 return 문이있는 lambdas는 ->double과 같이 선언 할 수있는 명시적인 반환 유형이 필요합니다.

더 중요한 것은 문제가되는 행은 λ302에 의해 캡쳐 된 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

+0

STL이 잘못된 이름을 사용하는 것처럼 보입니다. (나는 남자와 라이브러리를 의미합니다) – odinthenerd

+1

최소 재현 가능한 예'int main() {unsigned T = 1, t = 1; 자동 f = [&]() {return T && t;}; }'C2086 : '에 실패했습니다.'unsigned int & _T ': 재정의' – Praetorian