首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >推导出的模板类型不适用于` `std::function`

推导出的模板类型不适用于` `std::function`
EN

Stack Overflow用户
提问于 2020-08-24 14:10:21
回答 1查看 23关注 0票数 0

我试图通过下面的段落来理解编译错误的根本原因。

我的目标是在更新新的设置值时,根据每个设置通知消费者。

下面是一个简化的版本,它模拟了设置1、2更新时的情况

代码语言:javascript
复制
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 (开发工具集8)和CentOS 7

以下是来自我的编译器的抱怨(clang-7,g++-8发出完全相同的错误消息,所以我跳过了)

代码语言:javascript
复制
[ 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)>,没有任何特定的类型。

请说明一下这一点。我的理论有什么问题?提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-08-24 14:23:27

发现了类似的案例:How to convert a lambda to an std::function using templates

问题是模板不考虑类型之间的转换。因此,std::function和给定的lambda可以转换,但不一定可以通过模板推导。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63555571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档