1

コードを複数のファイルに分けていますが、これがわかりません。

グラフィックス.h:

...
class graphics {
public:
virtual void SizeMod(int w, int h);
...
}

グラフィックス.cpp:

...
void SizeMod(int w, int h) {
    //Code here.
}
...

main.cpp で:

...
graphics g;
...
int main (int argc, char **argv) {
    ...
    glutReshapeFunc(g.SizeMod);
    ...
}

エラー:

error C3867: 'graphics::SizeMod': function call missing argument list; use &graphics::SizeMod to create a pointer to member

そして、私はそれをしました:

...
graphics g;
...
int main (int argc, char **argv) {
    ...
    glutReshapeFunc(&graphics::SizeMod);
    ...
}

それでもエラーが発生します(別のエラー)。この問題を解決するものはありますか?

4

2 に答える 2

0

GLUT は C API です。glutReshapeFunction署名の関数へのコールバックを期待します

void (int, int)

あなたの場合、C++クラスのメンバー関数はgraphics::SizeModに署名があります

graphics::void(int, int)

現在、一般的な C ABI に厳密に変換できる明確に定義された C++ ABI はありませんが、ほとんどのコンパイラでのすべての実用的な手段については、上記の C++ シグネチャは次のようになります。

void(graphics*, int, int)

C ABI の眼鏡を通して見た場合。

この最初のgraphics*パラメーターは、暗黙のthisポインターです。

これは本質的に、それを glutReshapeFunction へのコールバックとして渡すと壊れることを意味します。

  • タイプが一致しない
  • どういうわけかインスタンスを渡す方法はありません

編集: Mike Dinsdale が指摘したように、C++ ラムダはここでは機能しません。


真剣に、同じ質問に何度も何度も何度も何度も答えるのに本当にうんざりしてうんざりしています... 週に3回ほど聞かれます.

于 2013-09-06T10:54:38.497 に答える