2017-09-02 11 views
2
#include<iostream> 
#include<stdio.h> 
#include<string.h> 

using namespace std; 

void cb(int x) 
{ 
    std::cout <<"print inside integer callback : " << x << "\n" ;  
} 

void cb(float x) 
{ 
    std::cout <<"print inside float callback :" << x << "\n" ; 
} 

void cb(std::string& x) 
{ 
    std::cout <<"print inside string callback : " << x << "\n" ; 
} 

int main() 
{ 

void(*CallbackInt)(void*); 
void(*CallbackFloat)(void*); 
void(*CallbackString)(void*); 

CallbackInt=(void *)cb; 
CallbackInt(5); 

CallbackFloat=(void *)cb; 
CallbackFloat(6.3); 

CallbackString=(void *)cb; 
CallbackString("John"); 

return 0; 

} 

上記のコードは3つの機能を持っていますが、3つのコールバックを作成してパラメータに応じてオーバーロードされた関数を呼び出すことができます。 CallbackIntは、パラメータとしてintを使用してcb関数を呼び出すために使用され、同様に2つの値を保持します。コンテキストタイプ情報のないオーバーロードされた関数

しかし、コンパイルすると以下のようなエラーが表示されます。最初のエラーのために

function_ptr.cpp: In function ‘int main()’: 
function_ptr.cpp:29:21: error: overloaded function with no contextual type information 
CallbackInt=(void *)cb; 
       ^~ 
function_ptr.cpp:30:14: error: invalid conversion from ‘int’ to ‘void*’ [-fpermissive] 
CallbackInt(5); 
     ^
function_ptr.cpp:32:23: error: overloaded function with no contextual type information 
CallbackFloat=(void *)cb; 
        ^~ 
function_ptr.cpp:33:18: error: cannot convert ‘double’ to ‘void*’ in argument passing 
CallbackFloat(6.3); 
      ^
function_ptr.cpp:35:24: error: overloaded function with no contextual type information 
CallbackString=(void *)cb; 
        ^~ 
function_ptr.cpp:36:24: error: invalid conversion from ‘const void*’ to ‘void*’ [-fpermissive] 
CallbackString("John"); 
+3

'無効*'のparamater関数ポインタを持っていない理由:あなたは、コンパイラに十分な情報が得られた場合

しかし、それはそれを推測することができますか? - > 'void(* CallbackInt)(int); ' –

+2

そしてなぜこれらのすべてのキャスト? - > 'CallbackInt = &cb;'(@FilipKočicaによって変更された後) –

+1

オーバーロードされた 'operator()'を持つ呼び出し元ラッパーを書く方が良いでしょう。別の変数にコールバックを格納する必要がある場合は、 'void(void *);の代わりに関数ポインタの型を正しく宣言する必要があります。 – VTT

答えて

6

1)コンパイラはcbの過負荷が選んだためにどの、知りません。
2)わかっても、明示的な変換を行わずにvoid*からvoid(*)(int)に変換しません。

void cb(int x) 
{ 
    std::cout <<"print inside integer callback : " << x << "\n" ; 
} 

void cb(float x) 
{ 
    std::cout <<"print inside float callback :" << x << "\n" ; 
} 

void cb(const std::string& x) 
{ 
    std::cout <<"print inside string callback : " << x << "\n" ; 
} 

int main() 
{ 

    void(*CallbackInt)(int); 
    void(*CallbackFloat)(float); 
    void(*CallbackString)(const std::string&); 

    CallbackInt = cb; 
    CallbackInt(5); 

    CallbackFloat = cb; 
    CallbackFloat(6.3); 

    CallbackString = cb; 
    CallbackString("John"); 

    return 0; 

} 
0

、残りの部分についてhere

のように、あなたが望むオーバーロードを指定するには、静的なキャストを使用し、あなたが有意義void *にint型やfloat型にキャストすることはできません。ここで何をしたいのか分かりません。おそらく、int型のパラメータを取る必要があります

CallbackIntは...

+1

関数ポインタ変数の型が正しく設定されていれば、キャストを使う必要はありません。 – VTT

+0

それは本当ですが、私はOPが何をしようとしているのか分かりませんでした。 – Khoyo

関連する問題