• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Opengl+jpeglibでC3867エラー)

Opengl+jpeglibでC3867エラー

このQ&Aのポイント
  • visual studio 2010 c++/cliのプロジェクトでOpengl+jpeglibで画像を表示しようとしているが、C3867エラーが発生してビルドが通らない。
  • 参考にしたサイトではglutDisplayFunc(&display)やglutDisplayFunc(&プロジェクト名::display)を試したが、C2275,C2227エラーが発生してうまくいかない。
  • どうすればエラーを解決できるのか教えて欲しい。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

★display をどう宣言していますか? クラスのメンバ関数として定義されていると想定して、以下の点の確認を。 (1) display をクラスのメンバ関数にする時は静的メンバ関数である必要がある。 static をつければ良いです。勿論、非静的データメンバなどにはさわれなくなりますが。 或いは、クラスのメンバ関数にするのをやめて、普通の関数として定義して下さい。 これは glutDisplayFunc の第一引数の型が "関数型 void (*)()" だからです。一方で (非静的) メンバ関数の型は "メンバ関数型 void (プロジェクト名::*)()" の様な類になります。(非静的) メンバ関数は、呼び出す為に「引数」に加えて「オブジェクトへの参照 (つまり、this ポインタの参照先)」も必要になるので、通常の関数とは異なる種類の物なのです。従って、メンバ関数は glutDisplayFunc に指定できません。 所で、static を伴って宣言された静的メンバ関数は、参照にオブジェクトへの参照を必要としないので、その型は "普通の関数型 void(*)()" になります。従って、静的メンバ関数は glutDisplayFunc に指定できます。 (2) display はクラス外部からアクセス可能でなければならない。(public: をつける。基本クラスから継承する場合は public 継承にするのも忘れずに。) ★あと、 (1) glutDisplayFunc(プロジェクト名::display); よりは (エラーメッセージにある通り)、 glutDisplayFunc(&プロジェクト名::display); と書いた方が良いでしょう。両者とも意味は全く同じ(前者は後者に暗黙変換される)ですが、コンパイラ・他のプログラマに意図が伝わりやすいのは後者です。 (2) プロジェクトの構成要素をまとめるのに class プロジェクト名{ ... }; としているのだとしたら、namespace を使用する (namespace プロジェクト名{ ... } とする) 方が一般的に適切です。実際にどちらが良いかは、プロジェクトの性質に依存するでしょうが、再考をお薦めします。 namespace にすれば中身はクラスのメンバではないので、静的メンバ関数・非静的メンバ関数などの違いに悩まされる事もありません(glutDisplayFunc に渡すのに関数宣言の static は不要)。 (3) エラーメッセージ C3867 の "関数呼び出しには引数リストがありません" は、プロジェクト名::display が glutDisplayFunc で受け取れないので、コンパイラが「プロジェクト名::display() と書きたかったのかもしれない」と邪推した為に出力したエラーメッセージです。この推測は誤っているので、今回はこのエラーメッセージは無視して構いません。 因みに、宣言の void display(void) の (void) は引数が空という事を意味するので、自分で呼び出すならば "display()" で正しいです。というよりそもそも "display(void)" 等という関数呼出の方法はありません。 (4) C2275,C2227 これは glutDisplayFunc(&this->display); の行ですね。この様な書き方はありません。

usami33
質問者

お礼

回答ありがとうございます ご指摘の通り、 「クラスのメンバ関数にするのをやめて、普通の関数として定義して下さい」 にしたら、無事ビルドできました。 構文は判ったつもりでも、C++の概念を未だに理解できていない自分が恥ずかしいです。

その他の回答 (2)

回答No.3

訂正: 関数型→関数ポインタ型 メンバ関数型→メンバ関数へのポインタ型

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.1

void display(void); displayの呼び出しで引数リストがありません。と出ているのですから、 display();と指定していませんか? display(void);と呼び出してください。

usami33
質問者

補足

回答ありがとうございます。 この様に定義しているんですが ヘッダ void JpegDisplay(void); 実態 void クラス名::JpegDisplay(void) { 使用箇所 glutDisplayFunc(JpegDisplay);

関連するQ&A

専門家に質問してみよう