实例化模板时出现编译错误 std::function

Compilation error when instantiating templated std::function

我想将接受模板化参数的仿函数传递给模板化函数。像这样:

// Generic translator
template <typename T>
int foo(T arg, std::function<int(T)> translate) {
  return translate(arg);
}

// Concrete translator
int chartoint(char c) {
  return static_cast<int>(c);
}

// Call site
void main() {
  foo('p', chartoint); // compilation error here
}

我收到 Candidate template ignored: could not match 'function<int (type-parameter-0-0)>' against 'int (*)(char)' 错误。

  1. 为什么不起作用?
  2. 如何让它发挥作用?

谢谢!

编辑: 这出于某种原因有效:

void main() {
  std::function<int(char)> chartoint_local = chartoint;
  foo('p', chartoint_local); // Works.
}

原题依旧。如果我能在没有额外变量的情况下做到这一点,我会很高兴。

您出错的直接原因是

 int foo(T arg, std::function<int(T)> translate)

T for std::function 处于非推导上下文中。最简单(尽管令人不快)的修复方法是显式提供模板参数:

foo<char>('p', chartoint); // no compilation error here