2012-10-19 122 views
0

我的問題與數字食譜有關。 我有一個全球性的功能,計算功能的載體,以最小化數值食譜:如何將函數作爲函數的參數傳遞給C++

VecDoub vecfunc(VecDoub_I x) { 
    // code is here 
} 

在一類功能運行,我試着撥打數字食譜功能蠑螈,如圖讀取我的功能vecfunc

class A { 
    void run() { 
     VecDoub_IO pt; 
     pt.resize(2); 
     pt[0] = 0.5; 
     pt[1] = 0.5; 
     bool check = false; 
     newt<VecDoub>(pt, check, &vecfunc); 
    } 
} 

功能蠑螈被聲明爲

template <class T> 
void newt(VecDoub_IO &x, Bool &check, T &vecfunc) 

爲什麼我會收到以下編譯器錯誤?

error C2664: 'newt' : cannot convert parameter 3 from 'VecDoub (__cdecl *)(VecDoub_I)' to 'VecDoub &' 
+0

InRe標題問題:有函數指針的c方式,函子的C++ 03方式和lambda表達式的C++ 11方式。我可以通過前兩個想法,也許一些嘗試和錯誤,但我希望一個職業球員將沿着比較和對比所有三個... – dmckee

回答

2

在呼籲newt你明確指定TVecDoub(您指定newt<VecDoub>),但你傳遞一個函數給它的地址,所以你的函數編譯器不能轉換爲VecDoub&。如果你想在newtVecDoub&然後調用vectfunc並將其存儲在一個臨時變量,然後將該變量傳遞給函數(因爲newt最後一個參數是對T的引用),但如果你真的需要在newt函數,那麼爲什麼你寫newt<VecDoub>(pt, check, &vecfunc)雖然你可以寫newt(pt, check, &vecfunc)並讓C++爲你推導出類型?而旁邊,以收到newt功能不參照得到他們,而不是由價值得到他們,所以newt應被宣佈爲:

template <class T> 
void newt(VecDoub_IO &x, Bool &check, T vecfunc) 

由於功能通常是小件物體或指針,這將工作做不會降低性能

+0

謝謝! 'newt(pt,check,vecfunc)'解決我的問題=) – Michael

1

因爲你應該調用函數並將返回值作爲參數傳遞,而不是函數本身。

newt<const VecDoub>(pt, check, vecfunc(something)); 

我加了const因爲引用必須是恆定的,否則從vecfunc返回值不能綁定到它,因爲它是一個臨時的。

爲了解釋:

newt<VecDoub>(pt, check, &vecfunc); 

試圖調用類似的功能,

newt_VecDoub(VecDoub_IO &x, Bool &check, VecDoub &vecfunc); 

你試圖傳遞的第三個參數是&vecfunc它具有類型VecDoub (__cdecl *)(VecDoub_I),所以它顯然無法工作。

相關問題