如何解决推导的模板类型不适用于`std :: function`
我试图通过以下段落来理解编译错误的根本原因。
我的目标是在更新新设置值时,针对每个设置通知消费者。
以下是一个简化的版本,它模拟设置1、2的更新时间
template <typename T>
struct Setting {
T Get() {
return T {};
}
};
template <typename T>
void ConsumeSettingValue(Setting<T>& a,std::function<void(T)> consumer) {
consumer(a.Get());
}
int main() {
Setting<std::string> s1;
Setting<int32_t> s2;
ConsumeSettingValue(s1,[](std::string v){
// Do consume
});
ConsumeSettingValue(s2,[](int32_t v){
// Do consume
});
}
我正在使用C ++ 17,clang-7,g ++ 8(devtoolset 8)和CentOS 7
这是我的编译器的抱怨(clang-7,g ++-8发出完全相同的错误消息,因此我跳过了)
[ 25%] Building CXX object CMakeFiles/UntitledLink.dir/main.cpp.o
/home/kdy/practice/untitled/main.cpp:196:3: error: no matching function for call to 'ConsumeSettingValue'
ConsumeSettingValue(s1,[](std::string v){
^~~~~~~~~~~~~~~~~~~
/home/kdy/practice/untitled/main.cpp:188:6: note: candidate template ignored: could not match 'function<void (type-parameter-0-0)>' against '(lambda at /home/kdy/practice/untitled/main.cpp:196:27)'
void ConsumeSettingValue(Setting<T>& a,std::function<void(T)> consumer) {
^
/home/kdy/practice/untitled/main.cpp:200:3: error: no matching function for call to 'ConsumeSettingValue'
ConsumeSettingValue(s2,[](int32_t v){
^~~~~~~~~~~~~~~~~~~
/home/kdy/practice/untitled/main.cpp:188:6: note: candidate template ignored: could not match 'function<void (type-parameter-0-0)>' against '(lambda at /home/kdy/practice/untitled/main.cpp:200:27)'
void ConsumeSettingValue(Setting<T>& a,std::function<void(T)> consumer) {
^
在ConsumeSettingValue,ConsumeSettingValue<std::string>
和ConsumeSettingValue<int32_t>
之后添加显式类型后,它可以正常工作
但我认为这些lambda仍可以推导为std::function<void(T)>
,而无需任何特定类型。
请对此进行说明。 我的理论怎么了? 预先感谢。
解决方法
发现类似的情况:How to convert a lambda to an std::function using templates
问题是模板不考虑类型之间的转换。
因此,std::function
和给定的lambda可以转换,但不一定可以推导模板。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。