2011-12-30 25 views
2

これは良い例です:私はOpenGLのglutMouseFuncをオーバーロードしようとしていますので、私の選択した名前空間とクラスの機能を受け入れるかもしれません。特に静的なものはInit::DisplayInit::mouseです。問題は、これは可能なのでしょうか?もしそうなら、これはどのように達成されますか?実装関数は静的関数ポインタを引数として受け入れることができますか?

..\OpenGL_03\/displayinit.h:27: error: variable or field 'glutMouseFunc' declared void 
..\OpenGL_03\/displayinit.h:27: error: expected primary-expression before 'int' 
..\OpenGL_03\/displayinit.h:27: error: expected primary-expression before 'int' 
..\OpenGL_03\/displayinit.h:27: error: expected primary-expression before 'int' 
..\OpenGL_03\/displayinit.h:27: error: expected primary-expression before 'int' 
..\OpenGL_03\/displayinit.h:27: error: void value not ignored as it ought to be 

ノートから

マイ実装

void glutMouseFunc(void (Init::DisplayInit::*mouse)(int, int, int, int)) { 
    (*mouse); 
} 

エラーが、私は、同じファイルのヘッダーファイル内の関数の宣言を置きます。私はまた、宣言の両方が、関数の定義が名前空間宣言の外側に存在することを確認しました(それぞれのファイルの大部分をラップします)。示されているように、最初のエラーの1つは、関数を変数またはフィールド(???)として読み取ります。

+0

エラーメッセージの名前がコードスニペットと一致しません。実際のコードを表示します。 –

+0

最初のエラーは、コンパイラーがコロンのためにビットフィールドまたはその周辺を指定していると考えていたことを示します。残りのエラーは、コンパイラがまだ混乱していたことを示しています。 –

答えて

5

これは、glutMouseFuncを定義するための合理的な方法ではありません。コールバックをすぐに呼び出すことは想定されていません。後で(マウスのアクティビティが発生したときに)ポインタを保存することになっています。

GLUT-提供されるバージョンを呼び出して、あなたの関数のアドレスを渡す:

#include <GL/glut.h> 
glutMouseFunc(&Init::DisplayInit::mouse); 

静的メンバ関数は通常の関数ポインタと互換性があります。

+2

アンパサンドは必要ありませんか? –

+1

@ JonathanLeffler:緩い関数と静的なメンバの場合、コンパイラは、アドレス演算子がなくても関数ポインタを作成したいと考えています。非静的メンバーの場合は、アンパサンドが必要です。しかし、私は実際に関数のアドレスを渡していることを明確にするために、常にアンパサンドを入れています。あなたが暗黙のうちにそのアドレスを取ることができたからといって、あなたがすべきことを意味するわけではありません。同様に、関数を呼び出すときには 'func_ptr()'も機能しますが、 '(* func_ptr)() 'を使うことを好みます。 –

4

見出しの質問に対する答えは「はい、関数は静的関数ポインタを引数として受け入れることができます」です。あなたはそれを使用して、関数内で引数の指定を関数へのポインタで、名前空間やクラスを指定しない

void glutMouseFunc(void (*mouse)(int, int, int, int)) { 
    (*mouse)(1, 2, 3, 4); 
} 

あなたは、関数の呼び出しで名前空間やクラスを指定してください:

glutMouseFunc(Init::DisplayInit::mouse); 
+0

私はこの問題を解消したことを知っていますが、['glutMouseFunc'](http://www.opengl.org/resources/libraries/glut/spec3/node50.html)は、コールバックをインストールし、関数。 –

+0

OK - それは...明確ではない(そして、OpenGLの詳細な知識が必要です。または、少なくとも私が持っている知識よりも多くの知識が必要です)。表記法は代入よりも関数呼び出しに近いので、呼び出しに変換しました。コールバックを設定する場合、代わりに 'cb_func_ptr = mouse;'のようなものが必要です。 –

関連する問題