试图克服 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" 都必须具有相同的签名(如重载)。在两个目标编译器上都能干净地编译。 (还没有测试执行,但我有信心。)再次感谢!
更新:是的,它执行了。
我以前用过 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" 都必须具有相同的签名(如重载)。在两个目标编译器上都能干净地编译。 (还没有测试执行,但我有信心。)再次感谢!
更新:是的,它执行了。