2011-08-24 53 views
3

以下是代碼。爲什麼我不能在C++ 0x中的lambda中聲明結構變量?

#include<struct.h> 
#include<iostream> 
#include<functional> 
using namespace std; 

void LambdaTest(const function <struct dummy (void)>& f) 
    { 
    struct dummy test = f(); 
    cout<<test.a<<endl; 
    } 

int main() 
    { 
    int val = 5; 
    struct dummy dum; 

    auto func = [val](void) -> struct dummy 
         { 
         dummy temp; 
         temp.a = val; 
         return temp; 
         }; 

    LambdaTest(func); 
    return 0; 
    } 

文件struct.h非常簡單。

struct dummy 
    { 
    int a; 
    }; 

GCC抱怨說

lambda_struct.cpp:19:38: error: field ‘temp’ has incomplete type

這可以嗎?如果是,那我該如何解決?如果不是,那爲什麼不呢?

編輯:

代碼(被他人發現)的返回類型的錯誤已得到修復。

SOLUTION:

的問題是,C++ 0X標準允許定義一個新的結構(和一個類也一樣,大概)中的λ定義本身的返回類型。所以如果struct關鍵字存在於返回類型中,編譯器會認爲它是一個新類型並開始抱怨。

固定的代碼是

#include<struct.h> 
#include<iostream> 
#include<functional> 
using namespace std; 

void LambdaTest(const function <struct dummy (void)>& f) 
    { 
    struct dummy test = f(); 
    cout<<test.a<<endl; 
    } 

int main() 
    { 
    int val = 5; 
    struct dummy dum; 

    auto func = [val](void) -> dummy 
         { 
         dummy temp; 
         temp.a = val; 
         return temp; 
         }; 

    LambdaTest(func); 
    return 0; 
    } 
+0

我得到的錯誤,你的拉姆達不MSVC返回值++。 '匿名命名空間':: :: operator()':必須返回一個值。一旦我確定它編譯並輸出了5. – 0x5f3759df

回答

7

的問題是不正確的GCC認爲你宣佈在後返回一個新的結構類型,並聲明不完整的類型,它是同類型的GCC認爲你聲明的一個領域。

還抱怨說,

error: 'temp' does not name a type

與分配行,因爲它是期待一個成員聲明,​​而不是一個聲明。

更改爲:

auto func = [val](void) -> dummy 
         { 
          struct dummy temp; 
          temp.a = val; 
          return temp; 
         }; 

會工作。

此外,提防不從函數返回一個值可能會引領你進入未定義行爲的境界。

+0

這個答案解決了我的疑惑。非常感謝。 – rpg

+0

這個答案不正確。你不能在結尾返回類型中定義結構,這只是一個g ++的bug。 –

0

會發生什麼,如果你拿走struct部分,只是定義變量是否正常?你知道,只是:

dummy temp; 

另外,儘量在lambda返回值擺脫其他多餘struct的。說到這,你需要實際回報temp它來編譯。

+0

GCC仍然不喜歡它。 – rpg

+1

令人驚訝的是,GCC(ideone)甚至沒有發佈關於lambda中缺少return語句的警告。它愉快地打印出'LambdaTest()'內的垃圾' – Praetorian

0

在C++,C不同,結構不放在一個單獨的命名空間,所以你不必使用關鍵字struct在每一個聲明。此外,還有在你的代碼中的錯誤,拉姆達需要返回dummy類型的實例。下面的編譯和運行如預期

#include<iostream> 
#include<functional> 
using namespace std; 

struct dummy 
    { 
    int a; 
    }; 

void LambdaTest(const function <dummy (void)>& f) 
    { 
    dummy test = f(); 
    cout<<test.a<<endl; 
    } 

int main() 
    { 
    int val = 5; 
    dummy dum; 

    auto func = [val](void) -> dummy 
         { 
         dummy temp; 
         temp.a = val; 
         return temp; // return the temp struct 
         }; 

    LambdaTest(func); 
    return 0; 
    } 

輸出:

5

相關問題