首页
学习
活动
专区
工具
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.

20320

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

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

1.2K31
  • C++ —— 剑斩旧我 破茧成蝶—C++11

    Function(T&& t)函数模板程序中,假设实参是int右值,模板参数T的推导int,实参是int左值,模板参数T的推导int&,再结合引⽤折叠规则,就实现了实参是左值,实例化出左值引⽤版本形参的...完美转发forward本质是⼀个函数模板,他主要还是通过引⽤折叠的⽅式实现,下⾯⽰例中传递给Function的实参是右值,T被推导为int,没有折叠,forward内部t被强转为右值引⽤返回;传递给Function...我们⽤省略号来指出⼀个模板参数或函数参数的表⽰⼀个包 在模板参数列表中,class...或typename...指出接下来的参数表⽰零或多个类型列表 在函数参数列表中,类型名后⾯跟...指出接下来表⽰零或多个形参对象列表...可变参数模板的原理跟模板类似,本质还是去实例化对应类型和个数的多个函数 4....->return type :返回值类型,⽤追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。⼀般返回值类型明确情况下,也可省略,由编译器对返回类型进⾏推导 6.

    5500

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

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

    2.6K50

    Chapter 5: Rvalue References, Move Semantics, PF

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

    5.1K40

    【C++11】{}右值引用移动语义类型分类引用折叠完美转发--C++

    const左值引用作为参数的函数,那么实参传递左值和右值都可以匹配。...移动构造函数是一种构造函数,类似拷贝构造函数,移动构造函数要求第一个参数是该类类型的引用,但是不同的是要求这个参数是右值引用,如果还有其他参数,额外的参数必须有缺省值。...移动赋值是一个赋值运算符的重载,他跟拷贝赋值构成函数重载,类似拷贝赋值函数,移动赋值函数要求第一个参数是该类类型的引用,但是不同的是要求这个参数是右值引用。...像f2这样的函数模板中,T&& x参数看起来是右值引用参数,但是由于引用折叠的规则,他传递左值时就是左值引用,传递右值时就是右值引用,有些地方也把这种函数模板的参数叫做万能引用。...Function(T&& t)函数模板程序中,假设实参是int右值,模板参数T的推导int,实参是int左值,模板参数T的推导int&,再结合引用折叠规则,就实现了实参是左值,实例化出左值引用版本形参的

    5400

    右值引⽤与移动语义

    移动构造函数与移动赋值操作符 定义 移动构造函数: 定义:移动构造函数接受一个右值引用作为参数,并通过“窃取”资源来初始化对象。...引用折叠指的是当我们使用模板和类型别名(typedef)时,组合不同类型的引用会产生新的引用类型。C++11 规定了一些折叠规则来处理这些情况: 右值引用的右值引用折叠成右值引用。...在 C++ 中,引用的作用是为了避免不必要的拷贝,直接操作原对象。引用折叠使得在模板中使用引用时,能根据实际传入的参数类型自动决定使用左值引用还是右值引用,从而提高性能。...引用折叠的应用示例 函数模板 在函数模板中,T&& 是一种万能引用(或转发引用),根据传入的参数类型,**T**** 会推导为左值引用或右值引用**。...remove_reference 用于移除引用,确保我们能够正确处理参数类型。

    13510

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

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

    2K20

    C++11特性:初始化列表、右值引用、可变模板

    移动构造函数是⼀种构造函数,类似拷⻉构造函数,移动构造函数要求第⼀个参数是该类类型的引 ⽤,但是不同的是要求这个参数是右值引⽤,如果还有其他参数,额外的参数必须有缺省值。...Function(T&& t)函数模板程序中,假设实参是int右值,模板参数T的推导int,实参是int左值,模板参数T的推导int&,再结合引⽤折叠规则,就实现了实参是左值,实例化出左值引⽤版本形参的...void f1(int& x) f1(n); //f1(0);//报错:没有与参数列表匹配的 函数模板 "f1" 实例 // 折叠->实例化为void f1(int& x)...可变参数模板的原理跟模板类似,本质还是去实例化对应类型和个数的多个函数。..., 最终在结点的构造中直接去匹配容器存储的数据类型T的构造,所以达到了前⾯说的empalce⽀持 直接插⼊构造T对象的参数,这样有些场景会更⾼效⼀些,可以直接在容器空间上构造T对象。

    8600

    【C++】C++11

    移动构造函数是⼀种构造函数,类似拷⻉构造函数,移动构造函数要求第⼀个参数是该类类型的引 ⽤,但是不同的是要求这个参数是右值引⽤,如果还有其他参数,额外的参数必须有缺省值。...Function(T&& t)函数模板程序中,假设实参是int右值,模板参数T的推导int,实参是int左值,模 板参数T的推导int&,再结合引⽤折叠规则,就实现了实参是左值,实例化出左值引⽤版本形参的...可变参数模板的原理跟模板类似,本质还是去实例化对应类型和个数的多个函数。 这⾥我们可以使⽤sizeof...运算符去计算参数包中参数的个数。..., 最终在结点的构造中直接去匹配容器存储的数据类型T的构造,所以达到了前⾯说的empalce⽀持 直接插⼊构造T对象的参数,这样有些场景会更⾼效⼀些,可以直接在容器空间上构造T对象。...默认⽣成的移动构造函数,对于内置类型成员会执 ⾏逐成员按字节拷⻉,⾃定义类型成员,则需要看这个成员是否实现移动构造,如果实现了就调⽤ 移动构造,没有实现就调⽤拷⻉构造。

    9210

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

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

    30920

    C++11特性大杂烩

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

    90950

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

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

    15900

    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 =。

    2.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.1K20

    【C++11】入门基础

    它是C++11引入的,它的主要目的是在不使用显式构造函数的情况下,实现统一的初始化语法。...std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了...初始化列表是一种在对象创建过程中用于初始化成员变量或数组的语法。它使用花括号{}将初始值列表放在对象的构造函数或初始化器中。...std::initializer_list是一个标准库类型,在C++11中引入。它是一个模板类,用于在不使用显式构造函数的情况下,以统一的方式初始化容器或其他对象。 3....它可以用于声明变量、函数返回值类型以及模板参数类型的推断。和auto的功能一样,用来在编译时期进行自动类型推导。

    6310

    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.8K63

    【C++11】可变参数模板新的类功能lambda包装器--C++

    可变参数模板的原理跟模板类似,本质还是去实例化对应类型和个数的多个函数。 这里我们可以使用sizeof…运算符去计算参数包中参数的个数。...,最终在结点的构造中直接去匹配容器存储的数据类型T的构造,所以达到了前面说的empalce支持直接插入构造T对象的参数,这样有些场景会更高效一些,可以直接在容器空间上构造T对象。...,如果没有显示在初始化列表初始化,就会在初始化列表用这个却绳子初始化,这个我们在类和对象部分讲过了,点击跳转,可以查看我的主页哦. 3、defult和delete C++11可以让你更好的控制要使用的默认函数...假设你要使用某个默认的函数,但是因为一些原因这个函数没有默认生成。比如:我们提供了拷贝构造,就不会生成移动构造了,那么我们可以使用default关键字显示指定移动构造生成。...lambda 表达式语法使用层而言没有类型,所以我们一般是用auto或者模板参数定义的对象去接收 lambda 对象。

    3200

    【C++课程学习】:C++11(C++发展,列表初始化,声明auto,typeid,decltype)

    ●C++11(2011年发布):新增了右值引用,可以给容器提供移动语义;新增了模板类initializer_list,因此可将initializer_list作为参数的构造函数和赋值运算符;新增了可变参数模板...}; Date d3={ 2025,02,02 }; return 0; } 2.2std::initializer_list 类进行初始化的时候,只能和构造函数的参数相匹配,不能多传,少传。...//vector a{ 0,1,2,3,4,5,6,7 }; 栈,堆有自己独特的性质,不能用initializer_list初始化,也就是没有实现initializer_list参数的构造函数...3.声明 3.1auto auto能自动进行类型推导,用auto用于变量的声明 ,编译器会自动的推导类型。 用途: 1.简化复杂类型变量的声明。 2.和范围for相结合。...4.在decltype中进行类型推导。 3.2decltype auto只能推导出类型decltype还能进行变量的运算,进行一系列的操作。

    8800
    领券