将函数作为参数传递,具有模板返回值

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替换为std::string,这应该没有什么区别,并且我无法重现它。 - chris
我也无法重现这个问题,但你可以通过调用 function<double>(&text, num, fn) 来覆盖模板参数推导。 - Jonathan Wakely
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Jason R
你是对的,谢谢帮助。 - TinF
1个回答

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;
 }

谢谢,那真的是问题所在...我只是忘记复制函数的第二次调用,导致类型不匹配(unsigned int 和 int)。请查看我的修改。 - TinF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接