c++ - 试图通过 std::bind 编译错误
问题描述
我以前使用过 std::bind ,我认为这种用法很接近,但不完全在那里,我不知道如何解决编译错误。
最终目标是一个中等大小的指向少量函数的指针数组,每个数组元素都有不同的参数。此时我只有一个函数和一个表条目。如果我能做到这一点,我想我可以解决剩下的问题。我想使用 std::function 以便可以将各种参数放入数组中。
到目前为止,这是一个函数的声明:
static Get *MakeGArrayStatic(void *Subscript, const void **array, unsigned int sizeOfArray);
以下是数组典型的单指针声明:
typedef std::tr1::function<Get *(void *, const void**, unsigned int)> GetMaker;
static GetMaker *gm1;
这是指针的定义:
Get::GetMaker *Get::gm1 = std::tr1::bind(&MakeGArrayStatic, &OutMsg::CurrentSeverity, FacSevTbls::SyslogSeveritiesForMessages, FacSevTbls::NumberOfTrueSeverities);
(Get 是一个类,CurrentSeverity 是一个枚举,SyslogSeveritiesForMessages 是一个 const char **,NumberOfTrueSeverities 是一个 size_t。)
我得到的错误(VS 2010)是
错误 C2440:“正在初始化”:无法使用 [ _Result_type=Get *、_Ret=Get *、_BindN=std 从“std::tr1::_Bind<_Result_type,_Ret,_BindN>”转换为“Get::GetMaker *”: :tr1::_Bind3,SyslogEnums::SeverityEnum *,const char **,size_t> ] 没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符
谁能指出我哪里出错了?
解决方案
再次感谢@PlinyTheElder,但我认为我们“官方”没有回答这个问题。关闭循环,这里是函数数组中第一个剪切的声明:
static Get *MakeGArrayStatic(void *Subscript, const char **array, size_t sizeOfArray);
static Get *MakeGStatic(void *field, size_t sizeOfField);
typedef std::tr1::function<Get *()> GetMaker;
static GetMaker gm[];
到目前为止,这是数组的定义:
std::tr1::function<Get *()> Get::gm[] = {
std::tr1::bind(&Get::MakeGArrayStatic, &OutMsg::CurrentSeverity, FacSevTbls::SyslogSeveritiesForMessages, FacSevTbls::NumberOfTrueSeverities),
std::tr1::bind(&MakeGStatic, Msg::MessageID, 8) } ;
这是一个调用函数的简单示例:
Get *g = Get::gm[0]();
结果比我希望的要好。我曾设想所有“小函数”都必须具有相同的签名(如重载)。在两个目标编译器上都能干净地编译。(尚未测试执行,但我有信心。)再次感谢!
更新:是的,它执行。
推荐阅读
- docker - 将大变量从文件加载到 dockerfile 运行
- r - 如何在 tm_credits 中旋转文本
- git - 迁移到 git 时如何在 svn 上重命名分支名称
- vue.js - 无法在 Storybook 中使用 @ 解决 Vue 组件
- javascript - 将一个大数组包装在一个对象中以避免在 React 中进行深度克隆是作弊吗?
- php - 如何计算while循环中的元素并应用css类?
- c# - openxml:跟踪在 word 文档中找不到的更改
- sql - 如何批量插入多个列
- winforms - 使用映射驱动器填充组合框
- powershell - 使用 PowerShell 进行 Robocopy:错误 3 (0x00000003) 系统找不到指定的路径