我在Ubuntu 12.04 LTS 32位上使用带有GNU工具链的C ++ 11。我知道有类似的问题已被提出,但我还没有找到这个问题,而且我无法从已发布的内容中得到任何结果,所以这里有:
我有这样的代码:
enum class FUNC_TYPES { FUNCTYPE_1,FUNCTYPE_2,FUNCTYPE_3};
class AClass
{
...
typedef void (AClass::* TFunc )( );
std::map<FUNC_TYPES, TFunc> mFuncMap;
void doStuff();
....
}
我像这样初始化mFuncMap:
void AClass::initFuncMap( )
{
mFuncMap[FUNC_TYPES::FUNCTYPE_1] = & AClass::doStuff;
}
所有这些都很好。
现在我想调用映射函数指针。
我尝试过这种形式,我知道这种形式适用于不适用于成员函数的函数指针。
mFuncMap[FUNC_TYPES::FUNCTYPE_1]( );
这会产生很长的解释性编译错误:
错误:必须使用'。'或' - &gt; '来调用指向成员的指针函数 (AClass *)this) - &gt; AClass :: mFuncMap.std :: map&lt; _Key,_Tp,_Compare, _Alloc&GT; ...
我尝试了几乎可以想到的每种形式的去引用,我从搜索中找到了 - 用括号,没有它们等等等......但是我无法正确地使用语法来进行此调用。
调用映射成员函数的正确语法是什么?我的声明或初始化是否有问题导致了这个问题?
答案 0 :(得分:3)
这与地图无关,与typedef无关。 You have a pointer-to-member-function and you're not invoking it properly
您需要AClass
来运行该功能:
AClass& a = someAClassSomewhere();
(a.*(mFuncMap[FUNC_TYPES::FUNCTYPE_1]))();
当然这非常难看,所以请考虑提前绑定对象:
typedef std::function<void()> TFunc;
std::map<FUNC_TYPES, TFunc> mFuncMap;
// ...
mFuncMap[FUNC_TYPES::FUNCTYPE_1] = std::bind(&AClass::doStuff, this);
// ...
mFuncMap[FUNC_TYPES::FUNCTYPE_1]();