2013-04-18 52 views
0

我正面临有关函数指针语法的问题。我之前使用过这些,但是我已经让事情变得完全不明显了。指向STL映射中的函数的指针

因此,我正在设计一个为游戏创建节点的工厂。该工厂的创建方法有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 list 
Argument types are (const unsigned int, <unkown-type>) 

谢谢!

+0

请注意,指向函数的指针和指向(非静态)成员函数的指针是有区别的。请参见[parashift C++ FAQ](http://www.parashift.com/c++-faq/fnptr-vs-memfnptr-types.html) – dyp

+1

这与“std :: map”没有任何关系。 –

回答

2

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

所以,&createBall的类型不是AbstractNode* (*)(void),这是AbstractNode* (Factory::*)(void)const,其中Factory是它出现在类的名称。如果你想那么一个指针到成员函数改变型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没有按” t取决于它出现的上下文。

我想你应该能够避免与投:

functors_[AbstractNode::NAME_BALL] = &createBall; 

因为指针赋值给一个重载函数同样是一个特例。但我懒得检查它。

+0

你是绝对正确的,我忘了宣布函数为静态,生病给了一个尝试 –

+0

@DanyKhalife:你也需要演员,特殊规则不会让编译器从哪种类型对'insert'需要,到'make_pair'应该有的模板参数。 –

+0

C风格的演员阵容真的让我发痒......: -/ –