我遇到了关于函数指针语法的问题。我之前使用过这些,但是我已经让事情变得不再明显了。
所以,我正在设计一个为游戏创建节点的工厂。工厂的create方法有2个重载,如下所示:
在工厂中,我有私有方法来处理创建过程(基于节点的类型)这里有两个创建球的方法:
最后这里是两个映射,其中我存储了所有的函数指针。这些映射会将调用重定向到正确的create方法(如果可能的话)
typedef AbstractNode* (*Functor)(void);
typedef AbstractNode* (*FunctorPosition)(Vector3);
map<unsigned int, Functor> functors_;
<unsigned int, FunctorPosition> functorsPosition_;
现在,我的问题是,在两个地图中添加函数指针的语法是什么。
这是我的最后一次尝试,它不会编译并抛出以下错误:
functors_.insert(make_pair(AbstractNode::NAME_BALL, &createBall));
显示错误:
No instance of function template std::make_pair matches the argument list
Argument types are (const unsigned int, <unkown-type>)
提前致谢!
答案 0 :(得分:2)
createBall
是一个非静态成员函数。指向成员的函数类型与指针到函数类型不同。
因此,&createBall
的类型不是AbstractNode* (*)(void)
,而是AbstractNode* (Factory::*)(void)const
,其中Factory
是它出现的类的名称。如果你想要一个指针-to-member-function然后更改类型Functor
(并确保当你来调用它时,你有一个Factory
实例来调用它)。如果需要指向函数的指针,请将createBall
更改为静态成员函数。
此外,编译器无法计算出您要创建的对的类型,因为&createBall
在名为createBall
的两个重载之间不明确。类型Functor
正确后,您可以写:
functors_.insert(make_pair(AbstractNode::NAME_BALL, (Functor)&createBall));
functorsPosition_.insert(make_pair(AbstractNode::NAME_BALL, (FunctorPosition)&createBall));
演员告诉编译器你指的是哪个函数 - 这是C ++中通常规则的特殊例外,即子表达式&createBall
的类型不依赖于它出现的上下文。
我认为你应该能够避免使用:
functors_[AbstractNode::NAME_BALL] = &createBall;
因为指向重载函数的指针同样是一种特殊情况。但是我懒得检查它。