我面临有关函数指针语法的问题。我以前用过这些,但是现在情况变得完全不明显了。因此,我正在设计一个为游戏创建节点的工厂。工厂的create方法具有2个重载,如下所示:AbstractNode * create(AbstractNode :: TYPE)const;AbstractNode * create(AbstractNode :: TYPE,Vector3)const;在工厂中,我有一些私有方法,这些方法将负责创建过程(基于节点的类型),这里有两个创建球的方法:AbstractNode * createBall()const;AbstractNode * createBall(Vector3)const;最后,这两个都是我存储所有功能指针的映射。这些映射会将调用重定向到正确的创建方法(如果可能的话)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 listArgument types are (const unsigned int, <unkown-type>)提前致谢! 最佳答案 createBall是非静态成员函数。指向成员函数的指针类型不同于指向函数的指针类型。因此,&createBall的类型不是AbstractNode* (*)(void),而是AbstractNode* (Factory::*)(void)const,其中Factory是它出现在的类的名称。如果要使用指向成员函数的指针,请更改类型(并确保当您调用它时,您有一个Functor实例可以对其进行调用)。如果要使用函数指针,则将Factory更改为静态成员函数。此外,由于createBall在名为&createBall的两个重载之间是模棱两可的,因此编译器无法确定要创建哪种类型的对。输入正确的createBall类型后,您可以编写:functors_.insert(make_pair(AbstractNode::NAME_BALL, (Functor)&createBall));functorsPosition_.insert(make_pair(AbstractNode::NAME_BALL, (FunctorPosition)&createBall));强制转换告诉编译器您要表示的功能-这是C ++中子表达式Functor的类型不依赖于其出现的上下文的通常规则的特殊例外。我认为您应该能够避免以下情况的演员表:functors_[AbstractNode::NAME_BALL] = &createBall;因为将指针分配给重载函数同样是一种特殊情况。但是我懒得检查一下。
08-16 00:18