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

将模板(不带规范)传递给std::thread()会产生错误:<未解决的重载函数type>匹配错误

将模板(不带规范)传递给std::thread()会产生错误:<未解决的重载函数type>匹配错误。

这个错误是因为在使用std::thread()函数时,传递的模板参数没有正确匹配到合适的重载函数。std::thread()函数是C++标准库中用于创建线程的函数,它接受一个可调用对象作为参数,并在新线程中执行该对象。

要解决这个错误,需要确保传递给std::thread()的模板参数能够正确匹配到可调用对象。以下是一些可能导致错误的常见原因和解决方法:

  1. 模板参数错误:确保传递给std::thread()的模板参数是可调用对象,例如函数指针、函数对象、lambda表达式等。如果模板参数不是可调用对象,将无法匹配到正确的重载函数。可以通过检查模板参数的类型和语法来解决这个问题。
  2. 函数签名不匹配:如果传递的是函数指针或函数对象,确保函数签名与std::thread()期望的函数签名匹配。std::thread()期望的函数签名是可调用对象的参数列表和返回类型。如果函数签名不匹配,将无法匹配到正确的重载函数。可以通过检查函数签名来解决这个问题。
  3. 类成员函数的使用:如果传递的是类成员函数,需要使用std::bind()或lambda表达式来绑定成员函数和对象实例。std::bind()可以将成员函数绑定到对象实例上,以创建可调用对象。lambda表达式也可以在其中捕获对象实例,并调用成员函数。确保使用正确的语法和参数来绑定成员函数和对象实例。

总结起来,要解决这个错误,需要确保传递给std::thread()的模板参数是可调用对象,并且函数签名与std::thread()期望的函数签名匹配。如果传递的是类成员函数,需要使用std::bind()或lambda表达式来绑定成员函数和对象实例。

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

相关·内容

Chapter 5: Rvalue References, Move Semantics, PF

Avoid overloading on universal references 不要既重载通用引用参数函数,又重载特定类型参数函数,这样造成匹配问题 按照正常重载解析规则,完全匹配胜过类型提升匹配...这样它就会产生许许多多参数类型重载实例函数。 在编译器为类自动生成移动和拷贝构造函数时,也不能使用重载通用引用参数构造函数,因为通用引用参数构造函数匹配顺序上会在其他重载函数之前。...在合适条件下,即便存在模板构造函数可以通过实例化来产生拷贝或者移动构造函数,编译器也自动产生拷贝或者移动构造函数。...这种做法核心是存在一个重载函数作为客户端API,然后任务分发到其他实现函数中。...f(processVal); //错误,proecssVal不是一个类型 //自动推导fwd不知道该匹配哪一个重载函数 fwd(processVal); 如果模板函数作为模板函数参数,同样也无法自动推导出匹配函数

5.1K40

终于弄明白了万能引用和右值引用区别

,这些型别包括 std::unique_ptr std::future和std::thread等 2,完美转发:使人们可以撰写接受任意实参函数模板,并转发到其他函数,目标函数接受到与转发函数所接受完全相同实参...1, 如改进为 std::forward,n 被传递给 setName,然后再转手传递给 w内部 std::string赋值运算符 W数据成员name可以直接从字符串字面值得到赋值,而不会产生std...,一旦万能引用成为重载候选 //它就会吸引大批实参型别 //实现4: //如何解决:撰写一个带完美转发构造函数 //实现4: //如何解决:撰写一个带完美转发构造函数 class Person{.../** logAndAdd有两个重载版本 1, 形参型别为 T&& 版本可以T推导为short,从而产生一个精确匹配 2,形参型别为 int版本只能在型别提升以后才能匹配到...//如果万能引用仅是形参列表一部分,该列表中还有其他非万能引用型别的形参的话,那么只要该非万能引用形参 //具备充分差匹配能力,则它就足以这个带有万能引用形参重载版本踢出局 //改造 e26 中函数

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

    理解模板类型推导 模板类型推导(template type deduction)指的是编译器通过函数参数类型来推断模板参数类型,从而确定函数模板实例化类型。...(解决局部变量初始化) ② 比起std::function, auto更省空间且快捷方便保存一个闭包lambda表达式。 ③ 对于STL容器遍历中,auto避免异常隐蔽错误。...另外,在构造函数有参数情况中,若不包含std::initializer_list参数或者 构造传入实参,()和{}产生一样效果,否则{}优先匹配std::initializer_list参数构造函数...在构造重载匹配中,只要参数能够强转std::initializer_listT,就会匹配std::initializer_list构造函数,即便有更加匹配构造函数。...当然遵循命名规范限域枚举命名可以避免此问题。 ② 限域枚举枚举名是强类型,限域枚举中枚举名隐式转换为整型(现在,也可以转换为浮点类型) 11.

    18220

    【C++修炼之路】31.异常

    二.C++异常概念 异常是一种处理错误方式,当一个函数发现自己无法处理错误时就可以抛出异常,让函数直接或间接调用者处理这个错误。 throw: 当问题出现时,程序抛出一个异常。...(这里处理类似于函数值返回) catch(…)可以捕获任意类型异常,问题是不知道异常错误是什么,因此在这里捕获异常属于未知异常,一般是异常捕获最后一道防线。...(后续讲) ---- 有可能单个catch不能完全处理一个异常,在进行一些校正处理以后,希望再交给更外层调用链函数来处理,catch则可以通过重新抛出异常传递给更上层函数进行处理。...throw没写,上面只是格式)却由于类型不匹配或者其他原因没有捕获,那么此时发生异常就不仅仅是D,A、B、C也都会相继抛出异常,因此,为了控制哪个函数抛异常,哪个函数不抛异常,抛什么类型】异常,就产生了如下方法...: 解决方法: 异常规格说明目的是为了让函数使用者知道该函数可能抛出异常有哪些。

    19130

    Visual C++ 中重大更改

    ,因为模板参数类型不匹配模板参数(该参数是指向 const 成员指针,但函数为非 const):           错误 C2893:未能特殊化函数模板“void S2::f(void)” 备注:使用以下模板参数...: 备注:“C=S1” 备注:“Function=S1::f”           若要在代码中修复此错误,请确保你使用模板参数类型匹配模板参数声明类型。 ...__declspec(align) 编译器不再接受函数 __declspec(align)。 以前始终忽略此项,但现在产生编译器错误。           ...,编译器尝试标识适当匹配 delete 运算符)。...现在,已从 中删除了所有 C++ 重载,现在仅包含在 中。 若要解决错误,包括 以获取已从 中删除函数声明。

    4.7K00

    Visual C++ 中重大更改

    ,因为模板参数类型不匹配模板参数(该参数是指向 const 成员指针,但函数为非 const):           错误 C2893:未能特殊化函数模板“void S2::f(void)” 备注:使用以下模板参数...: 备注:“C=S1” 备注:“Function=S1::f”           若要在代码中修复此错误,请确保你使用模板参数类型匹配模板参数声明类型。 ...__declspec(align) 编译器不再接受函数 __declspec(align)。 以前始终忽略此项,但现在产生编译器错误。           ...,编译器尝试标识适当匹配 delete 运算符)。...现在,已从 中删除了所有 C++ 重载,现在仅包含在 中。 若要解决错误,包括 以获取已从 中删除函数声明。

    5.2K10

    每个C++开发者都应该学习和使用C++11特性

    但这种方式存在一些问题,比如: 在重载函数或者模板中,如果同时存在参数为指针类型和整数类型函数,传递 NULL 或 0 可能导致调用了错误重载版本。...安全性:在重载函数或者模板中,使用 nullptr 可以避免因为整数类型隐式转换导致调用错误重载版本问题。 语法清晰:使用 nullptr 可以让代码更加清晰明了,表达程序员意图。...}; 在派生类中使用 override 关键字,如果没有正确地重写基类中函数,编译器产生错误。...这样可以避免一些常见错误,如函数签名不匹配等。 2. final 关键字 final 关键字用于修饰类和虚函数,表示禁止派生类继续派生或者禁止派生类重写该虚函数。...此外,它们还可用于用户自定义容器,只要这些容器提供了符合规范 begin() 和 end() 成员函数或全局函数

    6810

    UNIX(多线程):14---理解线程构造函数

    构造函数参数 std::thread构造函数是使用可变参数模板实现,也就是说,可以传递任意个参数,第一个参数是线程入口函数,而后面的若干个参数是该函数参数。....join(); t3.join(); 实验时候还发现一个问题,如果重载函数作为线程入口函数,会发生编译错误!...解决办法就是在Factor()外包一层小括号(),或者在调用std::thread构造函数时使用{},这是c++11中同意初始化语法。...但是,如果重载operator()运算符有参数,就不会发生上面的错误。...g++可能是比较严格,这种写法可能导致程序发生严重错误,索性禁止了。 而如果可以想真正传引用,可以在调用线程类构造函数时候,用std::ref()包装一下。

    60820

    【c++】c++异常&&c++异常处理详解

    ,当一个函数发现自己无法处理错误时就可以抛出异常,让函数直接或间接调用者处理这个错误 throw: 当问题出现时,程序抛出一个异常。...(这里处理类似于函数值返回) catch(...)可以捕获任意类型异常,问题是不知道异常错误是什么 实际中抛出和捕获匹配原则有个例外,并不都是类型完全匹配,可以抛出派生类对象,使用基类捕获...有可能单个catch不能完全处理一个异常,在进行一些校正处理以后,希望再交给更外层调用链函数来处理,catch则可以通过重新抛出异常传递给更上层函数进行处理 double Division(...,比如在new和delete中抛出了异常,导致内存泄漏,在lock和unlock之间抛出了异常导致死锁,C++经常使用RAII来解决以上问题 3.4 异常规范 异常规格说明目的是为了让函数使用者知道该函数可能抛出异常有哪些...throw(); // C++11 中新增noexcept,表示不会抛异常 thread() noexcept; thread(thread&& x) noexcept; 4.自定义异常体系 实际使用中很多公司都会自定义自己异常体系进行规范异常管理

    8910

    C++异常

    图片 执行完Func函数之后回到main函数,此时抛出异常已经被捕获了,后续catch语句都不会进入。 图片 到匹配catch子句并处理以后,继续沿着catch子句后面继续执行。...图片 异常重新抛出 有可能单个catch不能完全处理一个异常,在进行一些矫正处理后,希望再交给更外层调用链函数来处理,catch则可以通过重新抛出异常传递给更上层函数进行处理。...析构函数主要完成资源清理,最好不要在析构函数内抛出异常,否则可能导致资源泄漏(内存泄漏、句柄关闭等)。...new (std::size_t size) throw (std::bad_alloc); 由于这个规范不具有强制性,且C++标准库里异常体系较为混乱,一般而言实际中很少项目会去用库里异常体系。...异常会有一些性能开销。当然在现代硬件速度很快情况下,这个影响基本忽略不计。如:这个消耗在catch接收值这里进行对临时对象拷贝构造。 C++没有垃圾回收机制,资源需要自己管理。

    39800

    《C++Primer》第十六章 模板与泛型编程

    ,那么产生错误: // func重载版本: 每个版本接受一个不同函数指针类型 void func(int(*)(const string&, const string&)); void func(...由于arg是一个模板类型参数右值引用,Type表示传递给arg实参所有类型信息: 如果实参是一个右值,那么Type是一个普通(非引用)类型,forward返回Type&& 如果实参是一个左值...多个可行模板 当多个重载模板对一个调用提供同样好匹配时,应选择最特例化版本。 3. 非模板模板重载 对于一个调用,如果一个非函数模板与一个函数模板提供同样好匹配,则选择非模板版本。 4....缺少声明可能导致程序行为异常 通常如果使用了一个忘记声明函数,代码编译失败。但是对于重载函数模板函数而言,如果编译器可以从模板实例化出与调用匹配版本,则缺少声明就不会报错。...以前面的例子而言,如果缺少了接收T*模板版本,则编译器默认实例化接受const T&模板版本。 在定义任何函数之前,记得声明所有重载函数版本。

    1.9K10

    【C++】异常机制

    二、C++异常概念 异常是一种处理错误方式,当一个函数发现自己无法处理错误时就可以抛出异常,让函数直接或间接调用者处理这个错误。 throw: 当问题出现时,程序抛出一个异常。...(这里处理类似于函数值返回) catch(…) 可以捕获任意类型异常,问题是不知道异常错误是什么。...异常重新抛出 有可能单个 catch 不能完全处理一个异常,在进行一些校正处理以后,希望再交给更外层调用链函数来处理,catch 则可以通过重新抛出异常传递给更上层函数进行处理。...delete (std::size_t size, void* ptr) throw(); 但是以上规范并不一定有人遵守,编译器也不会做严格检查,所以以上规范可能并不准确。...C++11 中新增 noexcept 关键字,表示不会抛异常 thread() noexcept; thread (thread&& x) noexcept; 四、自定义异常体系 实际使用中很多公司都会自定义自己异常体系进行规范异常管理

    9010

    理解std::move和std::forward

    在运行时,他们什么都不做,不产生可执行代码。 std::move和std::forward只是执行转换函数(确切说应该是函数模板)。...然而,因为lvalue-reference-to-const参数类型可以被const rvalue匹配上,所以rvalue可以被传递给拷贝构造函数.因此即使text被转换成了rvalue,上文中成员初始化仍调用了...这样行为对于保持const正确性是必须。从一个对象里move出一个值通常会改变这个对象,所以语言不允许const对象传递给像move constructor这样会改变次对象函数。...:首先,std::move只需要一个函数参数(rhs.s), std::forward不只需要一个函数参数(rhs.s),还需要一个模板类型参数(std::string).然后,注意到我们传递给std:...消除了传递错误类型(比如说,一个std::string&,可以导致数据成员s被拷贝构造,而不是想要move构造)可能性。

    1.7K21

    异常讲解

    被选中处理代码是调用链中与该对象类型匹配且离抛出异常位置最近那一个(一般情况下编译器认为子类和父类是同一个类型)。...(这里处理类似于函数值返回) catch(…)可以捕获任意类型异常,问题是不知道异常错误是什么。...不能完全处理一个异常,在进行一些校正处理以后,希望再交给更外层调用链函数来处理,catch则可以通过重新抛出异常传递给更上层函数进行处理。...,最好不要在构造函数中抛出异常,否则可能导致对象不完整或没有完全初始化 2.析构函数主要完成资源清理,最好不要在析构函数内抛出异常,否则可能导致资源泄漏(内存泄漏、句柄关闭等) 3.C++中异常经常会导致资源泄漏问题...,比如在new和delete中抛出了异常,导致内存泄漏,在lock和unlock之间抛出了异常导致死锁,C++经常使用RAII来解决以上问题 3.4 异常规范 异常规格说明目的是为了让函数使用者知道该函数可能抛出异常有哪些

    8210

    【C++】一文全解C++中异常:标准库异常体系&自定义异常体系(含代码演示)

    (这里处理类似于函数值返回) 如果一个异常直到程序结束都没被捕获则程序会报错,所以 通常加上最后一道防线—— catch(…) 可以捕获任意类型异常,问题是不知道异常错误是什么。...如果有匹配,则 调到catch地方进行处理。 没有匹配catch则退出当前函数栈,继续在调用函数栈中进行查找匹配catch。 如果到达main函数栈,依旧没有匹配,则终止程序。...找到匹配catch子句并处理以后,继续沿着catch子句后面继续执行。...【3】异常重新抛出场景 有可能单个catch不能完全处理一个异常,在进行一些校正处理以后,希望再交给 更外层调用 链函数来处理,catch则可以通过重新抛出异常传递给更上一层函数进行处理。...,最好不要在 构造函数 中抛出异常,否则可能导致对象不完整或没有完全初始化 析构函数主要完成资源清理,最好不要在 析构函数 内抛出异常,否则可能导致资源泄漏(内存泄漏、句柄关闭等) C++中异常经常会导致资源泄漏问题

    61010

    【C++高阶】深入理解C++异常处理机制:从try到catch全面解析

    ,当一个函数发现自己无法处理错误时就可以抛出异常,让函数 直接或间接调用者处理这个错误 throw: 当问题出现时,程序抛出一个异常。...(这里处理类似 于函数值返回) 实际中抛出和捕获匹配原则有个例外,并不都是类型完全匹配,可以抛出派生类对象, 使用基类捕获,这个在实际中非常实用,我们后面会详细讲解这个 在函数调用链中异常栈展开匹配原则...如果有匹配,则 调到catch地方进行处理 没有匹配catch则退出当前函数栈,继续在调用函数栈中进行查找匹配catch 如果到达main函数栈,依旧没有匹配,则终止程序。...有可能单个catch不能完全处理一个异常,在进行一些校正处理以后,希望再交给更外层调用链函数来处理,catch则可以通过重新抛出异常传递给更上层函数进行处理 代码示例 (C++): double...之间抛出了异常导致死锁,C++经常使用RAII来解决以上问题,关于RAII 我们智能指针这节进行讲解 ⭐异常规范 异常规格说明目的是为了让函数使用者知道该函数可能抛出异常有哪些。

    48610

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

    而这依然产生问题,导致了 C++ 中重载特性会发生混乱,考虑: void foo(char *); void foo(int); 对于这两个函数来说,如果 NULL 又被定义为了 0 那么 foo(...被推导为 int * 注意:auto 不能用于函数参,因此下面的做法是无法通过编译(考虑重载问题,我们应该使用模板): int add(auto x, auto y); 此外,auto 还不能用于推导数组类型...为了解决这个问题,C++11 还引入了一个叫做拖尾返回类型(trailing return type),利用 auto 关键字返回类型后置: template<typename T, typename...,编译器不会为之产生真正函数代码,这样比透基类各种构造函数更加节省目标代码空间。...:每当你定义一个 lambda 表达式后,编译器自动生成一个匿名类(这个类重载了() 运算符),我们称为闭包类型(closure type)。

    2.6K50

    【C++】一文熟悉C++中异常机制

    throw抛出异常,销毁没有的catch语句函数栈桢,直到匹配catch语句: 3 异常使用 3.1 异常抛出和捕获 异常抛出和匹配原则 异常是通过抛出对象(throw)而引发,该对象类型决定了应该激活哪个...(这里处理类似于函数值返回) catch(...)可以捕获任意类型异常,问题是不知道异常错误是什么,用来避免出现未知错误!...总的来说:有可能单个catch不能完全处理一个异常,在进行一些校正处理以后,希望再交给更外层调用链函数来处理,catch则可以通过重新抛出异常传递给更上层函数进行处理!...、句柄关闭等) C++中异常经常会导致资源泄漏问题,比如在new和delete中抛出了异常,导致内存泄漏,在lock和unlock之间抛出了异常导致死锁(lock_guard可以进行解决!)...总之:异常不能是想抛出就抛出,一定要考虑好,不能对其他代码程序产生影响! 3.4 异常规范 异常规格说明目的是为了让函数使用者知道该函数可能抛出异常有哪些。

    12110

    C++11知识点总结(全面解析C++11经常考到知识点)

    有时候这样规则可能被忘记,最常见是声明了带参数构造函数,必要时则需要定义不带参数版本以实例化无参对象。...9.7 完美转发 完美转发是指在函数模板中,完全依照模板参数类型,参数传递给函数模板中调用另外一个函数。...实际在底层编译器对于lambda表达式处理方式,完全就是按照函数对象方式处理,即:如果定义了一个lambda表达式,编译器自动生成一个类,在该类中重载了operator()。...因为std::thread析构函数中,如果线程状态是jionable,std::terminate将会被调用,而terminate()函数直接终止程序。...,因此在C++11中,原子类型只能从其模板参数中进行构造,不允许原子类型进行拷贝构造、移动构造以及operator=等,为了防止意外,标准库已经atmoic模板类中拷贝构造、移动构造、赋值运算符重载默认删除掉了

    2K10

    第 16 章 模板与泛型编程

    第一个阶段是编译模板本身时。这个阶段,编译器可以检查语法错误,如忘记分号或者变量名拼错等。 第二个阶段是编译器遇到模板使用时。对于函数模板调用,检查实参数目是否正确和参数类型是否匹配。...如果不能从函数指针类型确定模板实参,则产生错误。...有时这可能造成意想不到结果。解决这种问题办法是,使用基于函数参数模板重载,来实参分别为右值或左值时情况分离开来。...(t2), std::forward(t1) ); } ---- 16.3 重载模板 函数模板可以被另一个模板或一个普通非函数模板重载,与往常一样,名字相同函数,必须具有不同数量或类型参数...如果涉及函数模板,则函数匹配规则会在以下几个方面受到影响: 对于一个调用,其候选函数包括所有模板实参推断成功函数模板实例。 候选函数模板总是可行,因为模板实参推断排除任何不可行模板

    1.4K60
    领券