为什么下面的代码不能编译(在C++11模式下)?
#include <vector>
template<typename From, typename To>
void qux(const std::vector<From>&, To (&)(const From&)) { }
struct T { };
void foo(const std::vector<T>& ts) {
qux(ts, [](const T&) { return 42; });
}
错误消息为:
prog.cc:9:5: error: no matching function for call to 'qux'
qux(ts, [](const T&) { return 42; });
^~~
prog.cc:4:6: note: candidate template ignored: could not match 'To (const From &)' against '(lambda at prog.cc:9:13)'
void qux(const std::vector<From>&, To (&)(const From&)) { }
^
但它不能解释为什么它不能匹配参数。
如果我让qux
成为一个非模板函数,用T
替换From
,用int
替换To
,它就会编译。
发布于 2017-01-29 20:49:49
如果不需要使用推导出的To
类型,可以直接推导出整个参数的类型:
template<typename From, typename F>
void qux(const std::vector<From>&, const F&) { }
发布于 2017-01-29 20:50:14
如果我错了,请纠正我,但是模板参数推导只推导出确切的类型,而不考虑可能的转换。
因此,编译器无法推导出To (&)(const From&)
的To
和From
,因为qux
需要一个对函数的引用,但您提供了一个具有自己类型的lambda。
发布于 2017-01-29 20:52:24
你完全没有机会让编译器去猜测什么是To
。因此,您需要显式地指定它。
另外,这里的lambda需要通过指针传递。
最后,这个版本可以正常编译:
template<typename From, typename To>
void qux(const std::vector<From>&, To (*)(const From&)) { }
struct T { };
void foo(const std::vector<T>& ts) {
qux<T,int>(ts,[](const T&) { return 42; });
}
https://stackoverflow.com/questions/41920890
复制相似问题