2014-09-06 195 views
2

我有以下功能:lambda函數作爲參數傳遞

template <typename Range> 
Range FindFirstIf(Range rng, bool (*Function)(typename Range::ConstReference value)) 

爲了這個功能,我想傳遞一個lambda函數是這樣的:

rng = FindFirstIf(rng, [](const float& val) { return (v < 0.0f); }); 

rng是名單的範圍浮動,所以Range::ConstReference被定義爲const float&

我的編譯器(gcc)抱怨類型不匹配

C:\Programming\Collections\main.cpp|24|note: mismatched types 'bool (*)(typename Range::ConstReference)' and 'main(int, char**)::< lambda(const float&) >'| 

有人可以告訴我我的代碼有什麼問題嗎?

編輯:

當我通過功能這樣的,它的工作原理:

bool (*func)(const float& v) = [](const float& v) { return v < 0.0f; };

當我嘗試使用auto關鍵字,這是同樣的問題之前:

auto func = [](const float& v) { return v < 0.0f; }; 
+1

你應該檢查'val',而不是'v'。 – hvd 2014-09-06 18:20:10

+0

你已經有了一個解釋什麼是錯的答案,但是也可能有用的是一個解決方法:'rng = FindFirstIf(rng,+ [](const float&v){return(v <0.0f);});'。 '+'強制直接將lambda轉換爲函數指針(因爲lambda類沒有提供重載的「+」運算符,但提供了轉換爲指針的運算符,其結果是「+」可以是應用),並且GCC 4.8不會將其檢測爲不匹配類型。 – hvd 2014-09-07 02:32:24

+0

@hwd謝謝你真的很好的解決方法 – 2014-09-08 11:22:53

回答

2

我懷疑你的代碼中是否有type-o,或者你正在使用的gcc版本沒有com完全實現lambda(或可能兩者)。

如果您的例子是:

[](const float& val) { return (val < 0.0f); } 

(V - > VAL)

如果Range::ConstReferenceconst float&,那麼代碼是合法的C++ 11。

這裏棘手的部分是一些 lambdas會隱式轉換爲函數指針。也就是說,那些沒有lambda-capture的lambda將轉換爲具有相同簽名的函數指針。

此:

template <class Range> 
Range 
FindFirstIf(Range, bool (*Function)(typename Range::ConstReference value)); 

struct range 
{ 
    using ConstReference = const float&; 
}; 

int 
main() 
{ 
    range rng; 
    rng = FindFirstIf(rng, [](const float& val) { return (val < 0.0f); }); 
} 

編譯我。

隨着在線gcc編譯器的一些小問題,這似乎是gcc 4.8中的一個bug,在4.9中修復。

+0

謝謝。 val-v只是一個錯字,所以看起來問題出現在我的編譯器版本中。 – 2014-09-06 18:27:33