2016-07-05 7 views
1

パラメータとして渡される関数ポインタにパラメータを渡そうとしています。関数ポインタへのパラメータの受け渡し

コード:

void Test(wchar_t* a, wchar_t* b) 
{ 
    // ... 
} 

void Test2(void(*Func)(wchar_t*, wchar_t*)) 
{ 
    // ... 
} 

int main() 
{ 
    Test2(Test(L"Hello", L"Testing")); 
    return 0; 
} 

私はこのエラーを取得しています:

​​

は私が達成しようとしているものを達成するために、これをどのように修正すればよいですか?

編集:申し訳ありませんが明確ではありません。私が実際に達成しようとしているのは、子プロセスに関数を注入し、2つのパラメータ(wchar_t *、wchar_t *)を渡して使用できるようにすることです。しかし、main関数はvoidまたはint argc、char ** argvのいずれかになります。だから私は、私は単にあなたはおそらく代わりに

void Test2(void(*Func)(wchar_t*, wchar_t*),wchar_t* x, wchar_t* y) 
{ 
    (*Func)(x,y); 
} 

int main() 
{ 
    Test2(Test,L"Hello", L"Testing"); 
    return 0; 
} 

のようなものを持ちたいグローバル変数

+0

あなたがしたいことに応じてラムダで十分でしょう。 – chris

+2

あなたが達成しようとしていることはまさに*ですか?あなたのコードは、あなたが気付いたように、有効なCではないので、あなたの意図の有用なデモンストレーションではありません。 –

+0

πάνταῥεῖの答えは私が達成しようとしているものですが、テンプレートを使ってC++のようなやり方をしたいのです – user1304765

答えて

4

を使用することによって達成しようとしているものを達成しました。あなたのコメント

How do i do this in C++ with templates?

については


私はこれがうまく動作するはず

template<typename Param> 
void Test2(void(*Func)(Param, Param), Param x, Param y) { 
    (*Func)(x,y); 
} 

void Test(wchar_t* a, wchar_t* b); 

int main() { 
    Test2(Test,L"Hello", L"Testing"); 
    return 0; 
} 

を考えることができます。

+0

答えは私が達成しようとしているものです。どのように私はテンプレートでC + +でこれを行うのですか? – user1304765

+0

@ user1304765私の答えが更新されました。あなたが実際に何を望んでいるかまだ分かりません。 –

+0

それは実際にはもう少し複雑です。子プロセスにコード(関数)を注入する関数が1つあります。この関数はこのパラメータを持っています:int(* Main)(wchar_t *、wchar_t *)。私が渡しているMain関数は、2つのwchar_t *をとる関数を呼び出します。 – user1304765

0

tihの問題を解決する方法は複数ありますが、このエラーがなぜ発生しているのかを表示しようとします。

すべての関数には、値の型が関連付けられています。これは、すべての関数が何らかの型の値を評価することを意味します。これは戻り値で示されます。例えば

int foo(/*whatever*/); 

はintに評価されます。従ってfoo(/*whatever*/)はどこでも使用できますintが期待されています。たとえば、int a = b + foo(/*whatever*/)のようになります。

シンプルfloat bar(/*whatever*/);は、floatと評価されるため、浮動小数点が期待される場所であればbar(/*whatever*/)を使用することができます。たとえば、float a = b + bar(/*whatever*/)のようになります。しかしvoid foobar(/*whatever*/)voidを返し

機能は、voidに評価し、いくつかのタイプ(たとえば整数、フロート、等)の値が予想される場合は、を使用することができません。

今すぐコードに移動します。ここで

int main() 
{ 
    Test2(Test(L"Hello", L"Testing")); /* Issue here */ 
    return 0; 
} 

あなたはTest2の引数としてTest(L"Hello", L"Testing")を渡している:あなたのmain関数内のこの行は、問題があります。 Test(/*whatever*/)を覚えているのは、が無効を返すため、voidと評価されます。

だから、あなたがその線でやっていることは

Test2(/*something that evaluates to a void*/); 

のようなものがしかし、Test2void異なるpointer to a function that returns void、あるvoid (*)(wchar_t*, wchar_t*)を、expectesあります。

何が起こっているのですか?void (*) (wchar_t*, wchar_t*)が予想される場所にvoidを渡していることをコンパイラが見ているので、正しくエラーを示しています。

他の回答に記載されているこの問題を解決するさまざまな方法があります。

0

Do I need to use C++ templates?

もちろん、あなたがC++のテンプレートを使用すると、それは次のようにそれを行うことができます。

#include<utility> 

// ... 

template<typename F, typename... A> 
void Test2(F &&f, A&&... a) 
{ 
    std::forward<F>(f)(std::forward<A>(a)...); 
    // ... 
} 

// ... 

Test2(Test, L"Hello", L"Testing"); 

しかし、あなたは、あなたがやろうとしているものを行うためにそれらを必要はありません。
@πάνταῥεalreadyは、なぜその答えで説明しましたか?

関連する問題