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