C++ 指向STL映射中函数的指针

C++ 指向STL映射中函数的指针,c++,visual-c++,function-pointers,C++,Visual C++,Function Pointers,我面临一个关于函数指针语法的问题。我以前用过这些,但现在的情况让事情变得完全不明显了 所以,我正在设计一个工厂,为游戏创建节点。工厂的create方法有2个重载,如下所示: AbstractNode*创建(AbstractNode::TYPE)常量 AbstractNode*创建(AbstractNode::TYPE,Vector3)常量 在工厂中,我有一些私有方法负责创建过程(基于节点的类型)。以下是创建球的两种方法: AbstractNode*createBall()常量 Abstra

我面临一个关于函数指针语法的问题。我以前用过这些,但现在的情况让事情变得完全不明显了

所以,我正在设计一个工厂,为游戏创建节点。工厂的create方法有2个重载,如下所示:

  • AbstractNode*创建(AbstractNode::TYPE)常量
  • AbstractNode*创建(AbstractNode::TYPE,Vector3)常量
在工厂中,我有一些私有方法负责创建过程(基于节点的类型)。以下是创建球的两种方法:

  • AbstractNode*createBall()常量
  • AbstractNode*createBall(Vector3)常量
最后这里是两个映射,我在其中存储了所有函数指针。这些映射将把调用重定向到正确的create方法(当然,如果可能的话)

显示的错误:

No instance of function template std::make_pair matches the argument list
Argument types are (const unsigned int, <unkown-type>)
没有函数模板std::make_对的实例与参数列表匹配
参数类型为(常量unsigned int,)

提前谢谢

createBall
是一个非静态成员函数。指向成员函数类型的指针与指向函数类型的指针不同

因此,
&createBall
的类型不是
AbstractNode*(*)(void)
,而是
AbstractNode*(Factory::*)(void)const
,其中
Factory
是它出现在其中的类的名称。如果需要指向成员函数的指针,请更改类型
Functor
(并确保在调用它时,有一个
工厂
的实例可以调用它)。如果需要指向函数的指针,请将
createBall
更改为静态成员函数

此外,编译器无法确定要创建哪种类型的对,因为
&createBall
在名为
createBall
的两个重载之间是不明确的。一旦类型
函子
正确,就可以编写:

functors_.insert(make_pair(AbstractNode::NAME_BALL, (Functor)&createBall));
functorsPosition_.insert(make_pair(AbstractNode::NAME_BALL, (FunctorPosition)&createBall));

CAST告诉编译器您的意思是什么,这是C++中通常规则的一个特殊例外,它的子表达式<代码>和CuraType < /C> >不取决于它出现的上下文。

我认为你应该能够通过以下方式避免演员阵容:

functors_[AbstractNode::NAME_BALL] = &createBall;

因为指向重载函数的指针赋值也是一种特殊情况。但是我懒得检查它。

注意,函数指针和(非静态)成员函数指针之间有区别。这与
std::map
没有任何关系。你完全正确,我忘了将函数声明为静态函数,我会给出一个例子try@DanyKhalife:您也需要强制转换,特殊规则不允许编译器从
insert
所需的对类型一直向内推断,对于模板参数
make_pair
应该有什么。C风格的类型转换真的让我很痒…:-/是的,我也有类型转换,一定忘了把它放在问题中。非常感谢@SteveJessop!哦,我测试了第二个建议(没有演员阵容),它也起了作用,我不认为它会起作用,这就是我使用insert的原因,但这只是让它更容易:)
functors_.insert(make_pair(AbstractNode::NAME_BALL, (Functor)&createBall));
functorsPosition_.insert(make_pair(AbstractNode::NAME_BALL, (FunctorPosition)&createBall));
functors_[AbstractNode::NAME_BALL] = &createBall;