2015-03-31 38 views
5

我有一些C++函數,看起來像如下:傳遞函數與模板的返回值參數

template<class T> bool function(QString *text, T number, T (*f)(QString, bool)){ 
    bool ok = true; 
    QString c = "hello"; 
    T col = (*f)(c, &ok); 
    // do something with col here ... 
    return true; 
} 

我從外面調用它以下列方式

double num = 0.45; 
double (*fn)(QString, bool) = &doubleFromString; 
function(&text, num, fn); 

和(編輯)

unsigned int num = 5; 
int (*fn)(QString, bool) = &intFromString; 
function(&text, num, fn); 

我得到錯誤

template parameter T is ambigious 

我想這個問題是在組合模板和傳遞函數作爲參數,但我不知道如何弄清楚。 (我不想用不同類型的函數兩次寫這個函數)。任何解決方案

+1

我取代'QString'用'性病:: string',這不應該有所作爲,而我[無法重現](http://coliru.stacked-crooked.com/a/f18cb5b956581425)它。 – chris 2015-03-31 16:16:53

+0

我也不能重現這個,但是你可以通過調用'function (&text,num,fn)' – 2015-03-31 16:17:48

+0

來重寫模板參數推導。在你的(編輯過的)例子中,'number'參數是'unsigned int',而你的函數指針返回'int'。那些不是相同的類型,因此編譯器錯誤。 – 2015-03-31 16:29:09

回答

1

錯誤消息指示T的模板參數不一致地被推斷 - 即您的第二個代碼段中返回的fn類型和num的類型不同。

這可以通過多種方式來解決,其執行下列操作之一可能是最簡單:

template<class T, class R> 
bool function(QString *text, T number, R (*f)(QString, bool)) { 
    // [..] 
    T col = f(c, &ok); // Cast if necessary. Dereferencing is superfluous, btw. 
    // [..] 
    return true; 
} 

或者,甚至比這更簡單,

template<class T, class F> 
bool function(QString *text, T number, F f) { 
    bool ok = true; 
    QString c = "hello"; 
    T col = f(c, &ok); 
    // [..] 
    return true; 
} 
+0

謝謝,這真的是問題..我只是忘了複製函數的第二個調用,其中是類型不匹配(unsigned int和int)。查看我的編輯 – TinF 2015-03-31 16:28:54