首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

模板构造函数类型推导不起作用(没有匹配的构造函数用于初始化...)使用function<>参数

模板构造函数类型推导不起作用是指在使用function<>参数时,无法找到匹配的构造函数进行初始化。function<>是C++11引入的一个模板类,用于包装可调用对象(函数、函数指针、成员函数指针等),并提供一种统一的方式来调用这些可调用对象。

在使用function<>参数时,编译器会尝试根据传入的参数类型推导出匹配的构造函数,然后进行初始化。但是,如果没有找到匹配的构造函数,就会出现模板构造函数类型推导不起作用的情况。

解决这个问题的方法有以下几种:

  1. 显式指定模板参数类型:可以通过显式指定模板参数类型来解决类型推导失败的问题。例如,如果function<>参数是一个函数指针,可以使用function<void(int)>来指定参数类型为void(int)的函数。
  2. 使用lambda表达式:lambda表达式可以用来创建匿名函数对象,并且可以自动推导参数类型。通过使用lambda表达式作为function<>参数,可以避免类型推导失败的问题。例如,可以使用function<void(int)>({})来创建一个接受int类型参数的函数对象。
  3. 使用std::bind:std::bind是一个函数模板,用于将可调用对象与其参数进行绑定,并返回一个新的可调用对象。通过使用std::bind将可调用对象与参数进行绑定,然后将绑定后的对象作为function<>参数,可以解决类型推导失败的问题。

总结起来,当模板构造函数类型推导不起作用时,可以通过显式指定模板参数类型、使用lambda表达式或者使用std::bind来解决问题。具体的解决方法需要根据具体的代码和需求来确定。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《Effective Modren C++》 进阶学习(上)

理解模板类型推导 模板类型推导(template type deduction)指的是编译器通过函数参数类型来推断模板参数类型,从而确定函数模板实例化类型。...对于通用引用推导,左值实参会被特殊对待 对于传值类型推导,实参如果具有常量性和易变性会被忽略 在模板类型推导时,数组或者函数实参会退化为指针,除非它们被用于初始化引用 2....作为对比,使用参数构造函数。 Widget w1(10); // 没问题,使用实参10调用Widget一个构造函数 需要初始化一个无参数构造函数对象时,会变成函数声明。...w4{10, 5.0}; // 使用花括号初始化,调用第二个构造函数 最后在使用参数{}初始化时,会匹配默认构造函数,只有传入{}才会匹配initializer_list构造函数。...当使用{}初始化参数时,会优先匹配默认构造函数,如果要匹配std::initializer_list构造函数,需要传入{}。 8.

16920

Chapter 5: Rvalue References, Move Semantics, PF

这样它就会产生许许多多参数类型重载实例函数。 在编译器为类自动生成移动和拷贝构造函数时,也不能使用重载过通用引用参数构造函数,因为通用引用参数构造函数匹配顺序上会在其他重载函数之前。...:当传入参数类型是Person时,应该调用拷贝构造函数,也就是要禁用模板;否则应该启用模板,将函数调用匹配到通用引用构造函数中。...Understand reference collapsing 当模板函数参数是一个通用引用参数时,当一个参数传递给这个模板函数模板参数推导类型才会编码这个参数是左值还是右值。...而标准规定:向函数模板传递一个花括号初始化参数,而模板参数没有指定参数类型为std::initializer_list,那么这就是一个不可推导情况。...这种情况下出错类型有: 编译器无法推导出一个类型:只要参数中有一个及以上无法推导类型,就无法编译 编译器推到出错误类型:要么是推导出来类型使得无法编译,要么是推到出来类型在重载函数情况下匹配到错误函数调用

5.1K40

C++11常用新特性快速一览

推导为 int * 注意:auto 不能用于函数传参,因此下面的做法是无法通过编译(考虑重载问题,我们应该使用模板): int add(auto x, auto y); 此外,auto 还不能用于推导数组类型...能不能用于推导函数返回类型。...C++11 还把初始化列表概念绑定到了类型上,并将其称之为 std::initializer_list,允许构造函数或其他函数参数一样使用初始化列表,这就为类对象初始化与普通数组和 POD 初始化方法提供了统一桥梁...类型别名模板 在传统 C++中,typedef 可以为类型定义一个新名称,但是却没有办法为模板定义一个新名称。因为,模板不是类型。...) { return x+y } 但在使用时发现,要使用 add,就必须每次都指定其模板参数类型

2.5K50

【笔记】《深入理解C++11》(上)

++11放松了就地初始化(类内直接赋值)使用限制并引入了构造函数后面的初始化列表设置....初始化列表效果总是慢于就地初始化, 但也快过在构造函数中进行赋值 注意: 非常量静态变量依然要在头文件外定义从而保证在程序中只存在一个 sizeof()可以对类成员表达式使用了 类模板也可以声明友元了...如果使用委派构造, 就必须在构造函数体中进行其余成员初始化 一种解决方案是修改构造顺序, 让参数最多构造函数作为委派构造最终目标, 然后在这个构造函数初始化列表中完成成员初始化....其他构造函数通过带有默认值委派构造来调用这个目标构造函数 千万小心环形委派, 会导致编译错误 委派构造函数使得构造函数模板编程也成为一种可能, 通过让模板构造函数成为委派构造函数, 我们可以很容易地接受多种不同类型参数进行相同底层初始化...} 这个特性在C++20中被concept以更好语法取代 4 新手易学, 老兵易用 auto auto是静态类型推导, 必须被初始化 auto本质上是一个类型占位符, 在编译时候推导类型然后以类似字面替换方式进行使用

1.8K20

【C++】泛型编程 ⑧ ( 类模板继承语法 | 普通类 继承 类模板语法 | 类模板 继承 类模板语法 | 继承类模板必须指定具体类型参数列表 | 继承 类模板 必须重写构造函数 )

一、普通类 继承 类模板语法 1、普通类 继承 类模板语法 类模板 作为父类 , 子类 继承 类模板 父类 , 需要 指定 具体类型参数列表 ; 需要 重写 构造函数 , 其中必须调用 类模板 具体类..., 类模板子类 与 普通类子类 区别就是 , 类模板子类 需要在尖括号中指定 具体 类型参数列表 数据类型 ; 此时 , 在继承时 , 被继承模板 必须 声明 类型参数列表 , 将具体泛型类型写在尖括号中..., 调用 类模板 具体类 构造函数 , 如果 子类 继承 类模板父类 , 如果 子类没有实现 构造函数 , // 类模板 继承时 , 需要具体化 类模板 // 也就是 指定 类模板 类型参数列表...class Son : public Father { public: // 类模板 子类 必须重写构造函数 // 在 子类 构造函数中 , 调用 类模板 具体类 构造函数...中 泛型 T , 与 Father 中 T 没有任何关系 , 也就是说 Son2 中 泛型类型 T 相当于 普通类 继承 类模板 具体类型 int , Father 类中 泛型 T 已经被覆盖掉了

55630

C++11特性大杂烩

数组或者结构体对象后面接着{},{}里是要初始化参数图片{}初始化同样适用于new表达式int* ptr1 = new int[4]{ 1,2,3,4 };创建对象时也可以使用列表初始化方式调用构造函数初始化...;但是vector和list是单个参数构造函数,并且没有多个参数构造函数,那是怎么做到下面的初始化呢?...图片使用初始化列表也只能进行固定参数初始化,如果想要做到和 STL 一样有任意长度初始化能力,可以使用 std::initializer_list 这个轻量级模板来实现。...函数按照传入参数类型匹配调用相同类型Func函数。...;模板处需要传递类名称(传递this指针);调用处需要传递类匿名对象。下面是对function包装器使用。可以看到这里有一个useF模板函数参数是两个模板参数

87950

C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)

C++11扩大了用大括号括起列表(初始化列表)使用范围,使其可用于所有的内置类型和用户自定义类型使用初始化列表时,可添加等号(=),也可直接省略 创建对象时也可以使用列表初始化方式调用构造函数初始化...它通常与 auto 结合使用用于声明变量类型或者作为模板参数推断一部分。...这里就能使用完美转发 完美转发是 C++11 引入一个特性,用于函数模板中保持参数值类别(左值或右值)和常量性,同时将参数原样传递给另一个函数。...返回值类型 -> return-type:用于指定Lambda函数返回值类型,可以省略,编译器会根据返回语句进行推导(一般情况都不写)。...C++中function本质是一个类模板function可以封装他们,目标是统一类型,统一后我们能传给各种容器使用函数指针的话类型复杂、仿函数类型不同、Lambda表达式没有类型

5800

【C++】继承 ⑥ ( 继承中构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

地方 , 都可以使用 " 公有继承 " 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外 所有 成员变量 和 成员方法 ; 功能完整性 :..." 应用场景 : 直接使用 : 使用 子类对象 作为 父类对象 使用 ; 赋值 : 将 子类对象 赋值给 父类对象 ; 初始化 : 使用 子类对象 为 父类对象 初始化 ; 指针 : 父类指针 指向...); } 2、使用 子类对象 为 父类对象 进行初始化 定义父类对象 , 可以直接使用 子类对象 进行初始化操作 ; // II....类型兼容性原则 : 使用 子类对象 为 父类对象 进行初始化 Parent parent = child; 3、完整代码示例 #include "iostream" using namespace...类型兼容性原则 : 使用 子类对象 为 父类对象 进行初始化 Parent parent3 = child; // 控制台暂停 , 按任意键继续向后执行 system(

22620

【C++】C++11 新特性

,使其 可用于所有的内置类型和自定义类型 初始值设定,即通过初始化列表初始化 (注意和构造函数初始化列表进行区分),并且在使用初始化列表初始化时,可以省略赋值符号 = 。...+11中列表初始化还适用于new表达式中 int* pa = new int[4]{ 1, 2, 3, 4 }; return 0; } 创建对象时也可以使用列表初始化方式调用构造函数初始化,...(STL 中所有容器都重载了参数类型为 initializer_list 构造和赋值函数,但是不包括容器适配器,因为容器适配器本身不是一个容器,其只是对容器封装) ---- 四、变量类型推导 1、...C++11 中废弃了 auto 原来用法,将其用于实现自动类型推导。不过我们必须对 auto 定义变量进行显示初始化,这样才能让编译器将定义对象类型设置为初始化类型。...->return-type:返回值类型,用追踪返回类型形式声明函数返回值类型没有返回值或者返回值类型明确情况下都可以省略,由编译器对返回类型自动推导,但是写上会增加可读性,一般不写。

1.3K10

C++20新特性个人总结

2.2  修改const限定成员指针  2.3  允许lambda表达值按值捕获this  2.4  指定初始化  2.5  lambda表达式支持模板  2.6  从构造函数推导模板参数类型 ...  声明变量时进行初始化,如果能从构造函数推导出变量类型,则该变量类型可以不用指定模板参数。 ...  因为模板参数是处于编译期计算,因此,作为调用用于自定义类型模板参数成员函数时,这些成员必须是constexpr修饰。 ...2.27  聚合初始化推导模板参数  通过聚合初始化参数类型推导出类模板参数类型  例子:  template struct S  {     T x;     T...;  ⑦引用类型,且引用相同对象或函数;  ⑧数组类型,对应元素满足模板参数等效;  ⑨共用体类型,或者都没有活动成员,或者都具有相同活动成员,且活动成员都是满足模板参数等效;  ⑩类类型,且对应直接子对象和引用成员满足模板参数等效

1.9K50

C++11新特性学习笔记

终端:g++ xxx.cpp -std=c++11 类型推导 auto auto自动类型推导用于初始化表达式中推断出变量数据类型。...C 语言中 auto 关键字主要用于自动类型推导,其中变量类型初始化表达式来推导,并不能隐式声明为指针或数组类型。 C++ 中 auto 关键字有着更加广泛用法。...在 C++11 中,它可以自动推导出更复杂类型,包括带类型指针、带有默认构造函数对象类型等。此外,auto 还可以用作迭代器类型推导,以及在泛型编程时模板类型推导。...因此,在C语言中,可以在定义局部变量时省略auto关键字,直接使用int或其他数据类型。 C++中auto是类型推导关键字,用于自动推导变量类型,可以简化代码并且提高代码可读性。...函数对象参数有以下形式: n 空。没有使用任何函数对象参数。 n =。

2K20

C++11新特性学习笔记

终端:g++ xxx.cpp -std=c++11 类型推导 auto auto自动类型推导用于初始化表达式中推断出变量数据类型。...C 语言中 auto 关键字主要用于自动类型推导,其中变量类型初始化表达式来推导,并不能隐式声明为指针或数组类型。 C++ 中 auto 关键字有着更加广泛用法。...在 C++11 中,它可以自动推导出更复杂类型,包括带类型指针、带有默认构造函数对象类型等。此外,auto 还可以用作迭代器类型推导,以及在泛型编程时模板类型推导。...因此,在C语言中,可以在定义局部变量时省略auto关键字,直接使用int或其他数据类型。 C++中auto是类型推导关键字,用于自动推导变量类型,可以简化代码并且提高代码可读性。...函数对象参数有以下形式: n 空。没有使用任何函数对象参数。 n =。

2.2K20

C++ 学习笔记

std::add_const_t; //c++14使用 2.9 类模板类型推导 1.c++17 开始,如果构造函数能够推断出所有模板参数类型,那么不需要指定参数类型了。...int 2.类型推导时,构造函数参数应该按照值传递,而非按引用。...名称出现在一个模板中 b. 名称是受限 c. 名称不是用于基类派生列表或构造函数初始化列表中 d. 名称依赖于模板参数 ADL 用于模板函数时,可能会产生错误。...,编译器会根据实参类型模板参数 T 定义形式,推导函数各个参数类型,如果最后推导结论矛盾,则推导失败。...T被推导为int[20] } 15.4 初始化列表 1.模板实参如果是初始化列表时,无法直接完成模板参数类型 T 推导

6.6K63

【笔记】C++2.0新特性

样例代码里面模板类型名后面的...称为模板参数包(template parameters pack), 函数参数部分类型名后面的...称为函数模板类型包(function template types...与现有的普通函数是否匹配, 如果匹配(也就是和()一致时)则调用, 否则编译失败 两个版本函数同时存在, 优先调用initializer_list版本函数使用()进行调用时, 则只能使用普通版本函数调用...当在构造函数使用, 代替()但没有指明参数时, 会进行默认构造, 即使是基本类型也会被默认构造为0 initializer_list本质是一个数组, 其类中成员是指向数组迭代器和记录initializer_list...和Lambda中, 替代了旧版本中不好用typeof 返回值: 在模板编程中, 我们不仅希望能自动推导参数类型, 还希望按照得到类型推导返回值, 如今可以借助尾置返回将模板函数写为下面的形式....auto Foo(T1 x, T2 y)->decltype(x+y) {dosomething;} TMP: 在模板元编程中, decltype主要用来自动推导参数类型, 从而利用这个类型进行其它变量使用

87020

C++11

,扩大了它使用范围,使其可以为所有内置类型或者自定义类型初始化值,使用初始化列表时,可添加等号(=),也可不添加。...C++11中废弃auto原来用法,将其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象类型设置为初始化类型。...3.3 decltype decltype出现是为了补齐auto 不支持对于表达式类型推导缺陷, 经常适用于后置返回类型推导....完美换发 完美转发是指在函数模板中,完全依照模板参数类型,将参数传递给函数模板中调用另外一个函数。...用追踪返回类型形式声明函数返回值类型没有返回 值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。 {statement}:函数体。

7910

c++11新特性,所有知识点都在这了!

auto:让编译器在编译器就推导出变量类型,可以通过=右边类型推导出变量类型。...auto a = 10; // 10是int型,可以自动推导出a是int decltype:相对于auto用于推导变量类型,而decltype则用于推导表达式类型,这里只用于编译器分析表达式类型,表达式实际不会进行运算...:搞定c++11新特性std::function和lambda表达式 模板改进 C++11关于模板有一些细节改进: 模板右尖括号 模板别名 函数模板默认模板参数 详细介绍请看:C++11模板改进...循环 cout << "i" << endl; } 委托构造函数 委托构造函数允许在同一个类中一个构造函数调用另外一个构造函数,可以在变量初始化时简化操作,通过代码来感受下委托构造函数妙处吧: 不使用委托构造函数...A a; // 编译出错 return 0; } 上面代码编译出错,因为没有匹配构造函数,因为编译器没有生成默认构造函数,而通过default,程序员只需在函数声明后加上“=default;”,

17.7K22

C++11『右值引用 ‖ 完美转发 ‖ 新增类功能 ‖ 可变参数模板

当传入参数为 右值 时,推荐使用 右值引用 作为参数类型;如果既有传入 左值 也有传入 右值 情况,可以重载一个 右值引用 参数版本,编译器会匹配最合适版本,确保资源不被浪费 常见 右值引用 作为参数类型有...2.1.模板万能引用 泛型编程 核心在于 模板根据参数类型推导函数,当我们分别传入 左值引用、右值引用 时,模板 是否能正确推导呢 下面这段代码含义是 分别传入 左值、const 左值、右值、...,可以将函数参数类型写为 T&&,因为模板具有自动推导特性,当传入参数为 左值 时,触发 引用折叠 机制,实际参数类型会变为 T&;当传入参数为 右值 时,正常使用 T&& 就行了 这一机制在模板中称为...当然不是,模板 是根据我们传入参数类型,来推导出相应函数,如果说 模板 推导没有问题,那问题就出在 回调函数 参数上了,只有推导后,无论传 左值 还是 右值,编译器都会把 val 变为 左值,这样才能解释为什么最终结果全部为...: int _a; }; 注意: 只有 构造 相关函数才有 初始化列表,其他函数没有这个东西,自然也就不能使用委托构造 4.可变参数 C++11 引入了 可变参数模板 和 可变参数特性,允许定义和使用可接受任意数量参数模板函数

30950

【C++】C++11常用特性总结

列表在C++中作用于对象时,同样也可以初始化对象。当然,{}列表在初始化对象时候会调用对象所属类构造函数。...而像函数传值返回带来深拷贝这样问题此时也就迎刃而解了,如果我们要将传值返回返回值接收,也就是用返回值初始化接收值时,由于返回值是一个右值,此时不再匹配拷贝构造或拷贝赋值,而是直接匹配移动构造或移动赋值...由于构造函数对内置类型不处理,所以C++11在成员变量打了补丁,即允许在类定义时候,给成员变量缺省值,这个缺省值会在构造函数初始化列表使用,进行成员变量初始化。...使用该修饰符时,参数列表不可省略(即使参数为空)。 ->returntype: 返回值类型。用追踪返回类型形式声明函数返回值类型没有返回值时此部分可省略。...返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。 {statement}: 函数体。在该函数体内,除了可以使用参数外,还可以使用所有捕获到变量 4.

77040

【笔记】C++标准库: 体系结构与内核分析(下)

之所以这么写是为了能利用模板参数自动重载所需函数, 从而在编译期解决判断问题: // 先让模板函数自己推导迭代器类型 template void do_something(...理解起来比较简单bind2nd()是为了实现这个功能首先设计了下面这个辅助模板函数作为接口: // 使用模板函数作为入口是因为只有模板函数能进行模板实参推导, 核心依然是函数模板类 template...arg2_type; // 利用推导出来类型进行模板构造, binder2nd才是真正发生适配地方 // 这里用arg2_type(x)来将实际传入参数转为适合仿函数类型,...所谓可适配类是如下图两个只有typedef而没有成员结构体. 我们自己仿函数构造时候就需要从模板类给出继承接口问题答案, 这样适配器才能正确处理....显然unary_function是指行为只有一个参数仿函数, binary_function是有两个参数函数.

77520

【新技术分享】C++17 最新进展

P0134R0 引入非静态成员变量拷贝构造函数//not sure P0136R1 重写继承构造器(core issue 1941 et al) P0160R0 删除一元运算符预设值//Wording...核心主题 1274.常见非终结符表达式和内嵌初始化列表 1391.非推导模板参数参数类型转化 1722.lambda函数指针转换函数应该不例外吗?...#include之外头文件名称 2004.常量表达式中有可变成员变量 2006.Cv-qualifiedvoid类型 2015.虚函数odr-use 2016.类型转换函数描述中可能存在歧义...&&不兼容 2052.模板参数推导vs重载操作符 2075.传递短初始化列表给数组引用参数 2101.对类型和值依赖错误说明 2120.数组作为标准布局类第一个非静态成员变量 库主题 1169....2384.分配器解除函数需要更好规范 2385.function::assign分配器参数无意义 2435.reference_wrapper::operator()标记应该是被删除 2447.分配器和

1.1K60
领券