2013-09-27 59 views
1

爲什麼我不能接受lambda表達式的模板函數?將lambda表達式傳遞給模板函數時的編譯錯誤

經過高低搜索 - 我認真,雖然這將工作,但這個C++代碼;

template <typename F> int proc(const F& lam) 
{ 
    return lam(); 
} 
void caller() 
{ 
    int i = 42; 
    int j = proc([&i]()->int{ return i/7; }); 
} 

我得到以下錯誤;

$ g++ x.cc 
x.cc: In function ‘void caller()’: 
x.cc:11:44: warning: lambda expressions only available with -std=c++0x or -std=gnu++0x [enabled by default] 
x.cc:11:46: error: no matching function for call to ‘proc(caller()::<lambda()>)’ 
x.cc:11:46: note: candidate is: 
x.cc:3:27: note: template<class F> int proc(const F&) 

我在使用G ++ 4.6.3和4.7.2的Linux

有誰知道我必須做的傳遞lambda表達式作爲參數來接收模板函數? - 我不想使用std :: function - 所以我唯一的選擇是創建一個醜陋的仿函數模式。

更新:試圖聲明參數const F & lam,但沒有成功。 UPDATE2:添加調用編譯器...

+0

你傳遞給編譯器的標誌是什麼? –

+0

無 - 無標誌 - 通過調用編譯器更新問題... – Soren

+1

您必須在g ++ 4.7.2中使用-std = C++ 11或在g ++ 4.6.3中使用-std = C++ 0x。 –

回答

3

由於拉姆達不是左值,則需要通過常量引用傳遞:

template <typename F> int proc(const F& lam) 

確保使用-std = C + + g ++ 4.7.2或-std = C++ 0x與g ++ 4.6.3。

+0

不幸的是,沒有解決問題.. x.cc:11:46:error:沒有匹配函數調用'proc(caller():: )' x.cc:11:46:note :候選人是: x.cc:3:27:note:template int proc(const F&) – Soren

+0

@Soren:這是一個編譯示例:http://ideone.com/PZbEgD –

+0

謝謝@Vaughn - 已嘗試剪切 - 粘貼你的工作代碼 - 仍然有同樣的問題 - 懷疑它是一個編譯器版本問題 - 你使用的是什麼版本? – Soren

相關問題