试图克服 std::bind 编译错误

Trying to get past std::bind compile errors

我以前用过 std::bind,我认为这种用法很接近,但还不够,我不知道如何解决编译错误。

最终目标是一个中等大小的指针数组,指向少量函数,每个数组元素中有不同的参数。此时我只有一个函数和一个 table 条目。如果我能做对,我想我能解决剩下的问题。我想使用 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 是一个 class,CurrentSeverity 是一个枚举,SyslogSeveritiesForMessages 是一个 const char **,NumberOfTrueSeverities 是一个 size_t。)

我得到的错误 (VS 2010) 是

错误 C2440:'initializing':无法从 'std::tr1::_Bind<_Result_type,_Ret,_BindN>' 转换为 'Get::GetMaker *' 和 [ _Result_type=获取*, _Ret=获取*, _BindN=std::tr1::_Bind3,SyslogEnums::SeverityEnum *,const char **,size_t> ] 没有可用的可以执行此转换的用户定义转换运算符,或者无法调用该运算符

谁能指出我哪里错了?

再次感谢@PlinyTheElder,但我想我们还没有回答这个问题 "officially"。关闭循环,这里是在函数数组中第一次切割的声明:

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]();

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

更新:是的,它执行了。