在 gcc 4.7 中使用 std::bind 编译错误

2024-03-29

我在使用时遇到很多麻烦std::bind在我的代码的各个地方。有时它有效,有时则无效,所以我认为我正在做一些根本错误的事情。

据我了解,以下基本用法std::bind应该可以正常工作:

#include <functional>

int foo(int a, int b){ return a+b; }

int main(){

    using namespace std::placeholders;

    // works
    auto bar_auto=std::bind(foo,1,_2);

    // compile error
    std::function<int(int)> bar_fun=std::bind(foo,1,_2);

    int quux=1;
    // compile error
    std::function<int(int)> bar_fun_lvalue=std::bind(foo,quux,_2);

}

肯定是类型bar_auto is std::function<int(int)>(类型foo with 1 int参数绑定),那么为什么bar_fun编译失败?包括我bar_fun_lvalue因为一些谷歌搜索告诉我右值曾经是有问题的 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35569。但这并没有解决任何问题。

它类似于this bug http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52612,但那太旧了,我不认为它是相关的。

gcc 的输出并不是特别有启发性:

在bindnew.cpp:1:0 包含的文件中: /usr/include/c++/4.7/function: 在‘static _Res 的实例化中 std::_Function_handler<_res ... _functor>::_M_invoke(const std::_Any_data&, _ArgTypes ...) [with _Res = int; _函子 = std::_Bind))(int, int)>;; _Arg类型 = {int}]’: /usr/include/c++/4.7/function:2298:6: 需要 ‘std::function<_res ...>::function(_Functor, 类型名 std::enable_if::value), std::function<_res ...>::_Useless>::type) [with _Functor = std::_Bind))(int, int)>;; _Res = int; _ArgTypes = {int};类型名 std::enable_if::value), std::function<_res ...>::_Useless>::type = std::function::_Useless]’ bindnew.cpp:15:52:此处需要 /usr/include/c++/4.7/function:1912:40: 错误: 与调用不匹配 ‘(std::_Bind))(int, int)>) (int)’ /usr/include/c++/4.7/function:1140:11:注意:候选者是: /usr/include/c++/4.7/function:1211:2:注意:模板 _Result std::_Bind<_functor ...>::operator()(_Args&& ...) [with _Args = {_Args . ..}; _结果= _结果; _Functor = int (*)(int, int); _Bound_args = {int, std::_Placeholder}] /usr/include/c++/4.7/function:1211:2:注意:
模板参数推导/替换失败: /usr/include/c++/4.7/function:1206:35: 错误:无法转换 参数传递中的‘std::_No_tuple_element’到‘int’ /usr/include/c++/4.7/function:1225:2: 注意:模板 _Result std::_Bind<_functor ...>::operator()(_Args&& ...) const [with _Args = {_Args ...}; _结果 = _结果; _Functor = int (*)(int, int); _Bound_args = {int, std::_Placeholder}] /usr/include/c++/4.7/function:1225:2:注意:
模板参数推导/替换失败: /usr/include/c++/4.7/function:1219:35: 错误:无法转换 参数传递中的‘std::_No_tuple_element’到‘int’ /usr/include/c++/4.7/function:1239:2:注意:模板 _Result std::_Bind<_functor ...>::operator()(_Args&& ...) 易失性 [with _Args = {_Args ...}; _结果 = _结果; _Functor = int (*)(int, int); _Bound_args = {int, std::_Placeholder}] /usr/include/c++/4.7/function:1239:2:注意:
模板参数推导/替换失败: /usr/include/c++/4.7/function:1233:35: 错误:无法转换 参数传递中的‘std::_No_tuple_element’到‘int’ /usr/include/c++/4.7/function:1253:2:注意:模板 _Result std::_Bind<_functor ...>::operator()(_Args&& ...) const 易失性 [with _Args = { _Args ...}; _结果 = _结果; _Functor = int (*)(int, int); _Bound_args = {int,std::_Placeholder}] /usr/include/c++/4.7/function:1253:2: 注意:模板参数推导/替换失败: /usr/include/c++/4.7/function:1247:35: 错误:无法转换 参数传递中的‘std::_No_tuple_element’到‘int’


占位符位置对象(例如,当您使用_2) 不是您调用的函数中参数的位置,而是创建的可调用对象中参数的占位符。相反,总是从_1并增加。

So:

auto bar_auto=std::bind(foo,1,_1);

etc.


这意味着您可以切换创建的对象中的参数std::bind只需这样做

auto bar_auto=std::bind(foo,_2,_1);

当你“呼叫”bar_auto对象,第一个参数将是第二个参数foo,调用中的第二个参数将是第一个参数foo.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 gcc 4.7 中使用 std::bind 编译错误 的相关文章

随机推荐

  • 如何在 pom.xml 文件中指定 Java 编译器版本?

    我在 Netbeans 中编写了一些 Maven 代码 大约有 2000 多行 当我在 Netbeans 上编译它时 一切都很好 但如果我想在命令行上运行它 我会收到以下错误 generics are not supported in so
  • JavaScript 风格的警报系统

    我在用smoke js http ssssnakes com smoke 它允许设置经典警报 javascript 窗口的样式 您所要做的就是放置 smoke在警报之前 即 smoke confirm 我遇到的问题是确定 取消回调 它对我不
  • 创建“拼写检查”,以合理的运行时间检查数据库

    我不是在询问如何实现拼写检查算法本身 我有一个包含数十万条记录的数据库 我想要做的是针对所有这些记录的表中的特定列检查用户输入 并返回具有特定汉明距离的任何匹配项 同样 这个问题不是关于确定汉明距离等 当然 目的是创建一个 您的意思是 功能
  • pyspark 中的交叉验证

    我使用交叉验证来训练线性回归模型 使用以下代码 from pyspark ml evaluation import RegressionEvaluator lr LinearRegression maxIter maxIteration m
  • HMC SHA1 哈希 - Java 生成与 C# 不同的哈希输出

    这是后续this https stackoverflow com questions 7175067 hmc sha1 hash c sharp producing different hash output than ruby问题 但我正
  • C# - 调整图像画布大小(保持源图像的原始像素尺寸)

    我的目标是获取图像文件并将尺寸增加到 2 的下一个幂 同时保留像素原样 也称为不缩放源图像 因此基本上最终结果将是原始图像 加上跨越图像右侧和底部的额外空白 因此总尺寸是 2 的幂 下面是我现在正在使用的代码 它创建了具有正确尺寸的图像 但
  • 在 Linux 上获取机器 ID 的最佳方法?

    获取唯一机器 ID 的最佳实践方法是什么GNU Linux for i386建筑学 除了这个还有什么好的办法吗mac地址 根据您的内核 DMI 信息可能可以通过 sysfs 获得 尝试一下 cat sys class dmi id boar
  • git-svn rebase 和 dcommit 问题

    git version 1 7 1 svn version 1 6 12 Ubuntu 10 10 我只有 git 我用过 svn 不过我没一起用过 我有一个 git 存储库 我必须将我的存储库升级为 subversion 存储库 所以我一
  • Drupal 7中用户的图片存储在哪里?

    我正在使用 SelectQuery 对象来检索和显示用户列表 但我不知道从哪里获取用户的图片 users 表有一列名为 picture 但其中的数据只是一个整数 图片是否存储在某个 blob 字段中 或者是否存在指向另一个表中图片的链接 图
  • Android:使用选择器更改按钮背景图像和颜色

    我有一个按钮 我将其背景设置为特定selector 选择器当前更改按钮背景并更改图像作为背景 我还希望更改背景颜色 图像是周围有透明空间的图标 这是选择器
  • PM2 是否应该在开发过程中使用?

    我从 Node js 世界开始 我注意到节点进程不会自动重新启动 通过搜索 我发现 Nodemon 可以完成这项工作 但我还发现 PM2 是 Nodemon 的替代品 那么我应该尝试 PM2 进行开发还是直接将其用于生产并使用 nodemo
  • 使用PHP openssl_verify()函数验证Android客户端APP创建的签名和数据

    我读到了关于帖子openssl verify http php net manual en function openssl verify php 我想问一些与openssl verify 因为我的 PHP 代码无法验证从 Java 创建的
  • 类似于 Android 的 Cocoa Pods 和 Bundler(用于依赖项)?

    有没有类似于bundler ruby 和cocoa pods ios 的东西来管理Android中的依赖关系 Gradle Maven Central 似乎是 Android 的等价物
  • 在 NodeJS 中创建 HTTPS 客户端

    我花了很长时间才弄清楚如何使用 Node js v0 3 8 安全地连接到 HTTP 服务器 我有以下代码 var http require http var client http createClient 443 host secure
  • XSLT 输出格式:保留换行符、删除缩进

    这是我的 XML
  • 如何使用 ChemDraw/Python 从 InChI 创建 .cdx 文件?

    我想使用 Python 从 InChI 创建一个 ChemDraw cdx 文件 这answer https stackoverflow com a 51543307 7295599给出了一个解决方案cdx gt InChI 下面的最小示例
  • VIM 闪烁问题

    我从我的 mac OSX 10 6 8 通过 SSH 连接到运行 centOS5 的学校服务器 当我尝试使用 VIM 时 它不会停止在 mac 终端内闪烁 有想法该怎么解决这个吗 请记住 我无权修改服务器上的任何 etc 文件或 bin 文
  • 在 Spring Boot 应用程序中检索具有相同密钥的多个 aws Secret

    有一个 Spring Boot 应用程序 起始父级为 2 4 8 该应用程序正在连接到多个数据源 并且用于在整个公司创建机密的自动化 Jenkins 作业的方式是 尽管机密名称不同 每个应用程序 源 但它们都具有相同的值 用户名 和 密码
  • 对象输入流错误[重复]

    这个问题在这里已经有答案了 我正在使用 ObjectOutputStream 创建序列化对象的文件 然后 我使用 ObjectInputStream 和 readObject 方法将对象从文件中取出 第一次效果很好 这意味着如果该文件不存在
  • 在 gcc 4.7 中使用 std::bind 编译错误

    我在使用时遇到很多麻烦std bind在我的代码的各个地方 有时它有效 有时则无效 所以我认为我正在做一些根本错误的事情 据我了解 以下基本用法std bind应该可以正常工作 include