2011-08-05 114 views
1

我有點新的C++ 0x中,任何人都可以向我解釋爲什麼下面的編譯失敗:C++ lambda表達式幫助

void memory_leak_report() 
{ 
    std::cout.flags(std::ios::showbase); 
    std::for_each(allocation_records.begin(), allocation_records.end(), 
        [] (const struct memory_leak_report& rec) { 
         std::cout << "memory leak at: " << rec.file << ": line " << rec.line 
           << std::hex << ", address: " << rec.address << std::dec 
           << ", size:" << rec.size << std::endl; 
    }); 
} 

其中allocation_records定義爲:std::list<struct memory_allocation_record> allocation_recordsmemory_allocation_record是一個簡單的C風格的數據結構。 G ++ -Wall -g -o頁頭的main.cpp -std =的C++ 0x

我得到的錯誤是:

struct memory_allocation_record { 
    const char *func; 
    const char *file; 
    unsigned int line; 
    unsigned int size; 
    unsigned long address; 
}; 

我試着編譯它 在功能ג_功能該標準::的for_each(_IIter,_IIter,_Funct)[與_IIter =標準:: _ List_iterator,_Funct = memory_leak_report()::]

錯誤:不對應的調用(memory_leak_report()::)(memory_allocation_record &)

注:候選人是:void(*)(const memory_leak_report( ):: memory_leak_report &)

+0

你有什麼錯誤? – jalf

+2

什麼是錯誤?不要說'struct',那不是C++。只是'const memory_leak_report&rec'很好。 –

+0

我總是發現模板編譯錯誤有點神祕,但錯誤是: – Arjor

回答

2

首先,在C++中,您不需要(並且通常認爲是不好的樣式),將struct放在結構的使用之前。只是const memory_leak_report&會做得很好。

其次,你能告訴我們如何在結構memory_allocation_record定義,但拉姆達需要memory_leak_report作爲它的參數,其中,因爲據我所看到的,是一個功能

是你的錯誤?拉姆達應該採取memory_allocation_record而不是?

當然,這將我們帶到最後一點。如果您遇到錯誤,您是否認爲告訴我們錯誤是什麼是相關的?否則,我們必須猜測我們認爲可能是在您的代碼中存在問題。

編輯
好吧,據我懷疑,這似乎是問題所在。我可以推薦實際閱讀編譯器的錯誤。這就是他們在那裏的原因。 )

採取錯誤的第一行:

/usr/include/c++/4.5/bits/stl_algo.h:4185:2: error: no match for call to ג(memory_leak_report()::<lambda(const memory_leak_report()::memory_leak_report&)>) (memory_allocation_record&) 

條遠無關的位:

no match for call to <somethingwithlambdas> (memory_allocation_record&) 

現在,因爲這是λ,類型是有點毛,但最後,它正在討論一個函數調用,所以最後一個圓括號描述了這個參數。換句話說,它試圖以memory_allocation_record&作爲參數調用函數,但無法找到匹配的函數。

相反,它發現在第二行中描述的候選人:

candidates are: void (*)(const memory_leak_report()::memory_leak_report&) <conversion> 

所以,它實際上發現候選人需要const memory_leak_report&作爲參數。

現在你只需要比較兩者。當編譯器試圖將memory_allocation_record&傳遞給期望const memory_leak_report&的函數時,這意味着什麼?

+0

對不起,我更新了帖子 – Arjor

+0

哈,發現 - 我完全錯過了那些長標識符!有我的野心成爲Java的思想。 –

+0

這與錯誤gcc報告一致,所以你可能是對的。錯誤是一個錯字。 –