首页 > 解决方案 > 试图通过 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> ] 没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符

谁能指出我哪里出错了?

标签: c++stdbind

解决方案


再次感谢@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]();

结果比我希望的要好。我曾设想所有“小函数”都必须具有相同的签名(如重载)。在两个目标编译器上都能干净地编译。(尚未测试执行,但我有信心。)再次感谢!

更新:是的,它执行。


推荐阅读