2

良い例を次に示します。OpenGLをオーバーロードしてglutMouseFunc、選択した名前空間とクラス関数を受け入れられるようにしようとしています。特に1つはInit::DisplayInit::mouse、静的なです。問題は、これは可能ですか?もしそうなら、これはどのように達成されますか?

私の実装

void glutMouseFunc(void (Init::DisplayInit::*mouse)(int, int, int, int)) {
    (*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

関数の宣言を同じファイルのヘッダーファイルに入れていることに注意してください。また、宣言関数の定義の両方が名前空間宣言の外側にあることを確認しました(両方のファイルのほとんどをそれぞれラップします)。示されているように、最初のエラーの1つは、関数を変数またはフィールド(???)として読み取ります。

4

2 に答える 2

5

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

GLUTが提供するバージョンを呼び出し、関数のアドレスを渡します。

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

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

于 2011-12-30T02:29:00.383 に答える
4

見出しの質問に対する答えは、「はい。関数は静的関数ポインターを引数として受け入れることができます」です。

名前空間またはクラスを、それを使用する関数の関数引数指定へのポインターで指定しないでください。

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

関数の呼び出しで名前空間またはクラスを指定します。

glutMouseFunc(Init::DisplayInit::mouse);
于 2011-12-30T02:22:08.933 に答える