2012-06-20 238 views
2

我有以下代码:传递函数指针作为参数

#include<iostream> 
using namespace std; 

typedef void (*HandlerFunc)(int, int); 
HandlerFunc mr; 
HandlerFunc mm() 
{ 
    return mr; 
} 

void sample(int a, int b, HandlerFunc func) 
{ 
} 

void main() 
{ 
    sample(1, 2, mm); 
} 

在这里,我想HandlerFunc类型的函数传递给另一个函数,但我得到一个错误:

Error :*: cannot convert parameter 3 from 'void (__cdecl *(void))(int,int)' to 'void (__cdecl *)(int,int)'

如果我输入为sample(1, 2, (HandlerFunc)mm);一切正常。
任何人都可以告诉解决错误问题的方法是什么?

+0

你想让'mm()'返回函数指针,还是想将'mm'定义为HandlerFunc类型? –

回答

5
HandlerFunc mm() 
{...} 

应该是:

void mm(int, int) 
{...} 

你的功能sample()需要一个函数指针(typedef d为HandlerFunc)作为最后一个参数。 作为此参数传递的函数的地址必须与它作为指针的函数的类型相匹配。

0

在主代码应该是:

sample(1,2,mm()); 

作为毫米返回一个HandlerFunc,它不是一个本身。

4

不,不,你混淆了类型。 mm是一个返回适当类型的函数指针的函数。然而,mm本身是而不是的适当类型 - 它不接受任何参数。

你应该主要通过mr,或通过mm()(那就是 - 打电话毫米,并通过返回值)

0
HandlerFunc mm() 
{  
    return mr; 
} 

这意味着nm是不会收到任何agruments(void)功能,它将收集类型为void (*)(int, int)的函数的指针

这样只有你得到那个错误。