【发布时间】:2014-06-20 10:52:10
【问题描述】:
我在 Ubuntu 12.04 LTS 32 位上使用 C++11 和 GNU 工具链。我知道有人问过类似的问题,但我还没有完全找到这个问题,而且我无法从已经发布的内容中得到任何有用的东西,所以这里是:
我有这样的代码:
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]( );
这会产生一个很长的解释性编译器错误:
错误:必须使用'.'或'->'来调用指向成员函数的指针 (AClass*)this)->AClass::mFuncMap.std::map<_key _tp _compare _alloc>...
我几乎尝试了我能想到的所有形式的取消引用,并且我通过搜索找到了 - 带括号,没有它们,等等等等......但我无法获得正确的语法来进行这个调用.
调用映射成员函数的正确语法是什么?我的声明或初始化是否有问题导致此问题?
【问题讨论】:
-
@user3477950:他可能希望使用
this,就像你写doStuff()而不是this->doStuff()一样。如果您还不知道,这不是一个飞跃。 -
下次请进一步缩小您的问题范围。这与地图无关,因此地图不应成为问题的一部分。如果你适当地缩小了问题的范围,你最终会意识到它归结为“我如何调用指向成员函数的指针?”然后你可以简单地谷歌它。
-
@LightnessRacesinOrbit - 他可能希望使用它.. 谢谢。我的想法正是如此:正如我在问题中解释的那样,对于非成员函数指针
()无需任何进一步的限定即可工作。我认为隐含的 this-> 也会起作用。我没有找到任何其他解释,我确实环顾四周。(我编辑了标题和标签) -
@Vector:当收到复杂的错误消息时,我建议您将您的陈述分解为多个部分以隔离问题。
TFunc const func = mFuncMap[FUNC_TYPES::FUNCTYPE_1]; func();指出问题出在func,而不是mFuncMap,从而使您更接近答案(并减少问题中的混乱)。 -
@Vector:是的,看过编译器的内部后,我可以向你保证,编写它们的人真的很关心有良好的诊断,但这真的很难,而且经常导致次优诊断.通过简短的陈述,您可以促进他们的工作,因此,您可以(通常)获得更准确的诊断,或者至少可以调查一小段代码:D
标签: c++ c++11 syntax member-function-pointers