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

boost::bind 不能处理函数重载 (error: no matching function for call to bind)

不过此时我仍怀疑是参数的问题,于是增加了一个同名的函数重载,参数照抄 create_task,结果就失败了;最神奇的是改为之前那版 start_task 也不行了,这才开始怀疑是函数重载的问题。..." 得到一些新的方案 (不能加 boost,bing 坑我),主要分两种: 强制转换 模板参数 其实不管哪种方式,都是在 bind 无法区分重载函数的场景下,告诉 bind 我们要绑定的是哪个重载版本,...按理说根据提供给 bind 的参数,再匹配重载函数的参数列表,应该可以挑选正确的重载版本。...关于std::function和std::bind绑定成员函数 [4]. boost::bind with overloaded functions? [5]. ...使用boost::bind和重载函数的访客模式 [6]. std::bind 和 成员函数中的重载函数 [7].  C++类重载函数的function和bind使用 [8].  C++ 闭包 探秘

1.2K50

C++模板编程:深入理解分离编译的挑战与解决方案

特化不能改变模板的接口:特化版本必须提供与一般化版本相同的成员函数和接口,否则会导致编译错误。 特化不能增加新的模板参数:特化版本不能增加新的模板参数,它必须匹配一般化版本中的参数数量。...总的来说,类模板特化是C++模板编程中一个强大而灵活的工具,它允许程序员为模板类或模板函数提供针对特定类型或值的定制实现,从而增强了模板的表达能力和适应性。...与类模板特化类似,函数模板特化也分为全特化和偏特化(尽管函数模板的全特化在语法上是通过函数重载来实现的,而不是真正的模板特化语法)。...对于函数模板,我们通常通过函数重载或SFINAE(Substitution Failure Is Not An Error,替换失败不是错误)技术来模拟类似的行为。...可以使用SFINAE技术来模拟函数模板的特化行为,但这通常涉及到条件编译和模板的实例化选择。 在实践中,为特定的类型提供函数重载通常是处理函数模板特化的最简单和最直接的方法。

19810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++】泛型编程 ⑨ ( 类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 | 类模板 的 外部友元函数问题 )

    类模板 的 函数声明 与 函数实现 都写在同一个类中 ; 类模板 的 函数实现 在 类外部进行 , 写在相同的 .h 和 .cpp 源码文件中 ; 类模板 的 函数实现 在 类外部进行 , 写在不同的....h 和 .cpp 源码文件中 ; 2、代码示例 - 函数声明与函数实现分离 对于下面的 Father 类中的 printValue 函数 , // 声明 类模板 父类 template <typename...; 二、普通类的运算符重载 - 函数声明 和 函数实现 写在同一个类中 下面的类是一个 普通类 , 其中定义了 成员变量 和 成员方法 ; 并为其重载了 左移运算符 和 加法运算符 ; 其中 加法运算符...三、类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 1、类模板 的 外部友元函数问题 将上述 " 普通类的运算符重载 - 函数声明 和 函数实现 写在同一个类中 " 示例改造成 类模板...示例 ; 问题就出现在 定义在外部的 友元函数 中 , 友元函数 , 不能 读取 和 访问 到 泛型类型 T , 也就是 类模板 中 的 template 泛型类型 T ; 在外部重新定义

    27110

    C++那些事之SFINAE

    介绍c++的SFINAE概念:类成员的编译时内省 0.导语1.C++自省?...overload resolution, SFINAE and the static behavior of sizeof 2.1重载决议 当一个函数名称和某个函数模板名称匹配时,重载决议过程大致如下:...根据名称找出所有适用的函数和函数模板对于适用的函数模板,要根据实际情况对模板形参进行替换; 替换过程中如果发生错误,这个模板会被丢弃 在上面两步生成的可行函数集合中,编译器会寻找一个最佳匹配,产生对该函数的调用...2.2 SFINAE 回忆一下上述的重载决议: 函数调用 函数模板 SFINAE 我已经用几个段落的强大功能来戏弄你了,现在终于可以解释这个并不复杂的缩写词了。...如果我们能处理一些编译时整数,我们不能做一些编译时比较吗? 答案是:绝对是的(当然可以比较),我亲爱的读者!

    2.2K20

    现代C++之SFINAE

    介绍c++的SFINAE概念:类成员的编译时内省 0.导语1.C++自省?...overload resolution, SFINAE and the static behavior of sizeof 2.1重载决议 当一个函数名称和某个函数模板名称匹配时,重载决议过程大致如下:...根据名称找出所有适用的函数和函数模板对于适用的函数模板,要根据实际情况对模板形参进行替换; 替换过程中如果发生错误,这个模板会被丢弃 在上面两步生成的可行函数集合中,编译器会寻找一个最佳匹配,产生对该函数的调用...2.2 SFINAE 回忆一下上述的重载决议: 函数调用 函数模板 SFINAE 我已经用几个段落的强大功能来戏弄你了,现在终于可以解释这个并不复杂的缩写词了。...如果我们能处理一些编译时整数,我们不能做一些编译时比较吗? 答案是:绝对是的(当然可以比较),我亲爱的读者!

    3K20

    浅谈 C++ 元编程

    类模板 和 函数模板 分别用于定义具有相似功能的 类 和 函数 (function),是泛型中对 类型 和 算法 的抽象。...在标准库中,容器 (container) 和 函数 都是 类模板 和 函数模板 的应用。...前者只能用于简记 已知类型,并不产生新的类型;后者则可以通过 函数模板返回值 等方法实现。尽管这两类模板不是必须的,但可以增加程序的可读性(复杂性)。...在 C++ 17 之前,和普通的编程不同,元编程的演算规则是纯函数的,不能通过 变量迭代 实现编译时迭代,只能用 递归 (recursion) 和 特化 的组合实现。...一般思路是:提供两类重载 —— 一类接受 任意参数,内部 递归 调用自己;另一类是前者的 模板特化 或 函数重载,直接返回结果,相当于 递归终止条件。它们的重载条件可以是 表达式 或 类型。

    3.1K61

    现代C++之SFINAE应用(小工具编写)

    ,紧接着是模板偏特化,分别继承了false_type、true_type,而继承之后就拥有了value属性,根据C++14特性,可以对访问value进行简化:is_pair_v。...,也就是第一个函数在std::declval() 重载函数,发现后面还有个output函数,最后决议不报错,这便是SFINAE...3.针对没有输出函数的容器处理 通过enable_if_t限定调用重载操作符是针对没有输出函数的容器,内部逻辑很简单,第一次只输出元素,后面就输出,与元素,也就是用,分割元素,最后就是比较重要的output_element...// 针对没有输出函数的容器处理 template<typename T, typename = std::enable_if_tSFINAE来实现的,当不是pair的时候就调用第二个重载函数了,否则就是第一个。

    1.2K20

    函数、类和运算符:Dart是如何处理信息的?

    今天就来聊聊Dart是如何处理信息的。 作为一门真正面向对象的编程语言,Dart将处理信息的过程抽象成了对象,以结构化的方式将功能分解,而函数、类与运算符就是抽象中最重要的手段。...类 类是特定类型的数据和方法的集合,也是创建对象的模板。 Dart是面向对象的语言,每一个对象都是一个类的实例,都继承自顶层类型Object。...,定义了两个成员变量x和y,通过构造函数进行初始化,成员函数printInfo的作用是打印它们的信息;而类变量factor则在声明时就已经赋好了默认值0,类函数printZValue会打印出它的信息。...我们可以这样理解:将operator和运算符作为一个整体,看作是一个成员函数名。 总结 函数,类和运算符是Dart处理信息的抽象手段。 函数是对象,可以被定义为变量,或者参数。...Dart不支持函数重载,但是提供了可选参数和可选命名参数的方式,从而解决了函数声明时需要传递多个参数的可维护性。

    94020

    C++泛型编程泛泛谈

    使用模板可以定义类或函数的操作,并让用户指定这些操作应处理的具体类型。...通常来说,我们将类定义和函数说明放在头文件中,而普通函数和类的成员函数的定义放在源文件中,模板则不尽相同:为了生成一个实例化的版本,编译器需要掌握函数模板或类模板成员函数的定义。...上面说的都是函数模板,还有一种是类模板。类模板是用来生成类的蓝图的。与函数模板不同之处是,编译器不能为类模板推断模板参数类型。...**注:**一个类模板的每一个实例都形成一个独立的类,而类模板的每个实例都有其自己版本的成员函数 所以,我们可能会出现一个单一模板并不能满足所有类型的需求,而模板特例化就出现了。...注:我们只能部分特例化类模板,而不能部分特例化函数模板。 被窝写文章就是不一样,写完直接合住电脑说晚安,晚安!

    1K30

    C++ 模板沉思录(上)

    这样的“东西”,在C++中有二:函数模板和类模板。 通过在普通的函数定义和类定义中前置template ,即可定义一个模板,让我们以上文中的Plus函数进行说明。...这里需要明确的是:模板、类型和值,是三个完全不一样的语法组分。模板能够“创造”类型,而类型能够“创造”值。...1.4 惰性实例化 函数模板不是函数,而是一个可以生成函数的语法组分;同理,类模板也不是类,而是一个可以生成类的语法组分。我们称通过函数模板生成函数,或通过类模板生成类的过程为模板实例化。...然后,我们声明了两个重载模板,其分别以两个“布尔值”作为返回值。这里的关键在于,重载模板的参数,一个是类成员指针,另一个是“...”。...} 可以看到,我们的上述实现只能去除一个星号,当传入一个多级指针时,并不能得到我们想要的结果。 这该如何是好?我们不禁想到:如果能够实现一个“while循环”,就能去除所有的星号了。

    1.3K20

    C++模版的本质

    模板实参和形参类似于函数的形参和实参,模板实参只能是在编译时期确定的类型或者常量,C++17支持模板类实参推导。 3....: 函数模板的签名包括模板参数,返回值,函数名,函数参数, cv-qualifier; 函数模板编译顺序大致:名称查找(可能涉及参数依赖查找)->实参推导->模板实参替换(实例化,可能涉及 SFINAE...)->函数重载决议->编译; 函数模板可以在实例化时候进行参数推导,必须知道每个模板的实参,但不必指定每个模板的实参。...这发生在尝试调用函数、取函数模板地址时,和某些其他语境中; 函数模板在进行实例化后会进行函数重载解析, 此时的函数签名不包括返回值(template argument deduction/substitution...); 函数模板实例化过程中,参数推导不匹配所有的模板或者同时存在多个模板实例满足,或者函数重载决议有歧义等,实例化失败; 为了编译函数模板调用,编译器必须在非模板重载、模板重载和模板重载的特化间决定一个无歧义最佳的模板

    1.7K30

    C++设计模式之SFINAE:用来检测类中是否有某个成员函数

    针对类中特定成员函数的检测其实在工作中也可能用到。C++中可以用SFINAE技巧达到这个目的。...SFINAE是Substitution Failure Is Not An Error的缩写,直译为:匹配失败不是错误。属于C++模板编程中的高级技巧,但属于模板元编程中的基本技巧。...在这个过程中,我发现有些常见的SFINAE写法是有问题的,下面探讨一下。 举个例子,我们来check一下C++标准库的类中有没有push_back()成员函数。...两个Helper类的模板参数中。第二个参数为 push_back的函数指针类型。之所以弄了两个Helper,是因为std::string的push_back的参数为char。...如果是检测其他成员函数,比如size则不需要这么麻烦只要一个Helper即可。 而test函数,对于返回true的模板函数,其参数是一个指针类型。

    4.6K20

    C++20初体验——concepts

    由于concept不能被特化,这一任务只能落到客户肩上,并且我不认为C++能进化出语义检查。...如果模板参数代入时出现了不存在的类型或变量,该约束仅仅是不被满足,而不会产生编译错误。 约束可以用于函数模板、类模板和成员函数,非模板类的非模板成员函数除外。...函数模板与类模板的约束是类似的,只有满足约束时模板才能实例化;对于成员函数的约束,如果它作用于模板类的模板参数,当约束不满足时,并不是类模板不能被实例化,而是实例化后的模板类没有这个成员函数: #include...,根据SFINAE,该重载被忽略;与此同时第二个是可用的。...的表达式也都得出现,不能像上面的concept实现那样利用两个函数之间由重载优先级建立起的层次关系。与上一节相比,这里的代码重复更恶心一点。

    1.4K10

    C++ 学习笔记

    a : b; } 1.5 函数模板重载 1.一个非模板函数可以和同名的函数模板共存,并且函数模板可实例化为和非模板函数具有相同类型参数的函数。函数调用时,若匹配度相同,将优先调用非模板函数。...Class 类型(包含 struct 和 union),模板(包含部分特例化,但不能是全特例化),以及 inline 函数和变量,在一个编译单元中只能被定义一次,而且不同编译单元间的定义 应该相同. 10.5...16.1 当泛型代码不再适用的时候 16.2 重载函数模板 1.函数模板和普通函数一样,是可以被重载的。...普通函数和模板函数也可以同时重载,此时在匹配程度相同时,优先调用普通函数。...的萃取 可以基于 SFINAE 原理排除某些重载的函数模板。

    6.8K63

    【C++】泛型编程 ⑪ ( 类模板的运算符重载 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中 )

    将 类模板 函数声明 与 函数实现 分开进行编码 , 有 三种 方式 : 类模板 的 函数声明 与 函数实现 都写在同一个类中 , 也就是没有分开进行编码 ; 类模板 的 函数实现 在 类外部进行 ,...函数声明 和 实现 写在相同的 .cpp 源码文件中 ; 类模板 的 函数实现 在 类外部进行 , 函数声明 和 实现 写在不同的 .h 和 .cpp 源码文件中 ; 在博客 【C++】泛型编程 ⑨ (...类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 | 类模板 的 外部友元函数问题 ) 中实现了第一种情况 , 类模板 的 函数声明 与 函数实现 都写在同一个类中 , 也就是没有分开进行编码...; 在博客 【C++】泛型编程 ⑩ ( 类模板的运算符重载 - 函数实现 写在类外部的同一个 cpp 代码中 | 类模板 的 外部友元函数二次编译问题 ) 中 , 分析了 第二种情况 , 类模板 的...; 一、类模板的运算符重载 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中 1、分离代码 后的 友元函数报错信息 - 错误示例 上一篇博客 【C++】泛型编程 ⑩ ( 类模板的运算符重载

    25310

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

    有了extern后编译器会自动删除重复的实例化模板, 不但节省内存还节省了多余的实例化时间 注意被其他文件调用的外部模板一定要在要用到的类实例化之前实例化 局部和匿名成员可以作为模板实参了, 但仍要注意匿名类型的声明不能在参数位置..., 所以当发生冲突的时候应该显式声明构造函数来因此冲突的函数 当派生类是虚继承了基类时, 不能使用继承构造函数 一旦使用了继承构造函数(用using Base::Base;)暴露出来, 自身的默认构造函数就和之前的隐藏规则一样...不但可以调用基类的构造函数, 也可以调用当前类的其他构造函数, 这样就能进一步减少重复代码 但要注意委派构造不能和普通的初始化列表共用, 因为目标构造(初始化列表)总是先于委派构造被调用, 这会导致目标构造的参数无效..., 例如当存在非POD成员且这个成员有非平凡的构造函数时, 这个union的默认构造将被删除 匿名的union对外是开放的, 因此放在类的声明中可以按照构造函数的不同而初始化为不同的类型, 此时类被称为枚举式的类...auto的类型推导式从左到右进行的, 由于类似字符替换的特性, 表达式auto t = 1, &r = t, *p = &r;是合法的 auto不能作为形参的类型, 需要泛型的时候还是应该用模板处理

    2K20

    C++ 的发展

    函数和运算符重载:C++ 1.0 支持函数重载和运算符重载,使得程序员可以根据需要定义不同版本的函数或操作符。...模板的优势: 代码重用:通过模板,函数和类可以支持多种不同的类型,而不需要为每个类型编写重复的代码。 类型安全:模板在编译时进行类型检查,确保类型的正确性,避免了运行时的类型错误。...主要特性: 模板: C++98 中的模板特性得到了进一步的增强,支持函数模板和类模板,并且模板的使用变得更加广泛。模板参数可以是类、函数、指针等类型。...异常处理:C++98 提供了标准的异常处理机制,允许在代码运行过程中抛出和捕获异常,避免程序因错误而崩溃。...示例代码:模板特化修复和 SFINAE 改进 #include #include // 模板类的默认实现 template

    61510

    【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧

    3.2 类模板的偏特化 偏特化允许对模板的一部分参数进行特化,而不需要对全部参数进行特化。它使得模板能够更灵活地处理复杂的类型组合。...3.3 类模板特化的应用示例 类模板特化在处理不同类型的对象时,能够大幅提高代码的灵活性和可读性。...第七章: 模板匹配规则与SFINAE 7.1 模板匹配规则 C++编译器在调用模板时,会根据传入的模板参数进行匹配。模板匹配的规则比较复杂,涉及到多个优先级和模板特化。...7.1.1 优先调用非模板函数 在匹配时,编译器会优先选择非模板函数,如果有完全匹配的非模板函数存在,编译器会选择该函数,而不是实例化模板。...在 CheckType 函数模板中,当传入的参数是整数类型时,编译器选择第一个版本,而当参数是浮点数类型时,选择第二个版本。

    14010

    C++ 特性使用建议

    3.函数重载 (1)仅在输入参数类型不同、功能相同时使用重载函数(含构造函数),当使用具有默认形参值的函数(方法)重载的形式时,需要注意防止二义性。...例如,用 AppendString() 和 AppendInt() 等,而不是一口气重载多个Append()。 4.缺省参数 不建议使用缺省函数参数,尽可能改用函数重载。...虽然通过缺省参数,不用再为个别情况而特意定义一大堆函数了,与函数重载相比,缺省参数语法更为清晰,代码少,也很好地区分了必选参数和可选参数。...(5)不要用 ## 处理函数,类和变量的名字。 17.认清0、‘\0’、nullptr 与 NULL 整数零用 0,实数零用 0.0,空字符用 ‘\0’,空指针用 nullptr 或 NULL。...如果你使用递归的模板实例化,或者类型列表,或者元函数,又或者表达式模板,或者依赖SFINAE,或者sizeof 的trick 手段来检查函数是否重载,那么这说明你模板用的太多了,这些模板太复杂了,我们不推荐使用

    1.7K20

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

    C++11的时候: 函数体只能有单一的return语句(或者额外的不影响数据的编译期语句) 函数必须返回值, 因为一定要从常量表达式中获得常量 函数使用前(编译期)一定要有定义 返回语句中不能有非常量的函数或数据...注意此时类的构造函数函数体必须为空, 所有成员都只能依靠常量表达式在初始化列表中初始化 常量表达式不能用于virtual 常量表达式函数不需要重写非常量版本, 编译器会自动生成, 重写反而会报错 当模板函数声明为常量表达式后..., 如果函数的实例化结果不满足常量表达式要求, 那么常量表达式符号会被忽略而不会报错(也是一种SFINAE) 变长模板 C标准中的变长宏不强调类型并不安全 C++11中的tuple模板就是典型的变长模板...注意函数参数包必须是函数的最后一个参数包(模板参数包没有这个要求) 模板参数包可以在以下七个位置展开, 但是不用太关注, 这些展开位置基本覆盖常见需求: 表达式 初始化列表 基类描述列表 类成员初始化列表...位域不能是类的静态成员 位域在内存中是从低向高顺序放置的 位域的典型应用是bool的极限压缩(bool:1)和RGB565分配(R:5, G:6, B:5) 语法和内存布局如下: // 通过成员名后加冒号和位域结束的

    1.1K31
    领券