アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります

visual studio 2010 c++/cliのプロジェクトで
Opengl+jpeglibで画像を表示しようとしているのですが

このエラーが出てしまい、ビルドが通りません
何が悪いのか教えていただけないでしょうか

error C3867: 'プロジェクト名::display': 関数呼び出しには引数リストがありません。メンバーへのポインターを作成するために '&プロジェクト名::display' を使用してください


ここを参考に作成しております
http://www21.atwiki.jp/opengl/pages/68.html

ここを参考に以下の様にしたのですが
今度はC2275,C2227エラーになってしまいダメでした
http://forum.programuj.com/viewtopic.php?t=5410& …
glutDisplayFunc(&display);
glutDisplayFunc(&プロジェクト名::display);
glutDisplayFunc(&this->display);


C2275,C2227

A 回答 (3件)

★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); の行ですね。この様な書き方はありません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます

ご指摘の通り、
「クラスのメンバ関数にするのをやめて、普通の関数として定義して下さい」
にしたら、無事ビルドできました。

構文は判ったつもりでも、C++の概念を未だに理解できていない自分が恥ずかしいです。

お礼日時:2014/08/11 09:20

訂正:


関数型→関数ポインタ型
メンバ関数型→メンバ関数へのポインタ型
    • good
    • 0

void display(void);



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

この回答への補足

回答ありがとうございます。

この様に定義しているんですが

ヘッダ
void JpegDisplay(void);

実態
void クラス名::JpegDisplay(void) {

使用箇所
glutDisplayFunc(JpegDisplay);

補足日時:2014/08/11 09:09
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!