2015-03-31 100 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