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いますが、エラーが発生しています:

エラー :*: パラメータ 3 を から'void (__cdecl *(void))(int,int)'に変換できません'void (__cdecl *)(int,int)'

キャストを入力すると、sample(1, 2, (HandlerFunc)mm);すべて正常に動作します。
エラーの問題を解決する方法は誰にもわかりますか?

4

4 に答える 4

5
HandlerFunc mm()
{...}

次のようにする必要があります。

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

あなたの関数は、最後の引数として function( you d assample() )へのポインタを取ります。この引数として渡す関数のアドレスは、ポインターである関数の型と一致する必要があります。typedefHandlerFunc

于 2012-06-20T10:38:42.380 に答える
4

いいえ、いいえ、タイプを混同しています。mm適切な型の関数ポインタを返す関数です。ただし、mmそれ自体は適切な型ではありません。パラメーターを受け入れません。

mrmain で渡すか、渡す必要がありますmm()(つまり、mm を呼び出して戻り値を渡します)。

于 2012-06-20T10:40:12.310 に答える
0
HandlerFunc mm() 
{     
   return mr; 
}  

これはnm、agruments()を受け取らないvoid関数であり、タイプの関数へのポインタを返すことを意味しますvoid (*)(int, int)

そのため、あなただけがそのエラーを受け取ります。

于 2012-06-21T11:29:38.660 に答える
0

メインのコードは次のようになります。

sample(1,2,mm());

mm は HandlerFunc を返すため、それ自体ではありません。

于 2012-06-20T10:40:03.510 に答える