实例化模板时出现编译错误 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)'
错误。
- 为什么不起作用?
- 如何让它发挥作用?
谢谢!
编辑:
这出于某种原因有效:
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
我想将接受模板化参数的仿函数传递给模板化函数。像这样:
// 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)'
错误。
- 为什么不起作用?
- 如何让它发挥作用?
谢谢!
编辑: 这出于某种原因有效:
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