error C3867 関数呼び出しには引数リスト

このQ&Aのポイント
  • VS2008 VC++ 環境でコンパイル中に、error C3867 関数呼び出しには引数リストがありませんというエラーが発生
  • エラーの原因は、Cortex_SetDataHandlerFunc関数に引数リストを渡していないため
  • 解決方法は、関数呼び出し時に引数リストを渡すことである
回答を見る
  • ベストアンサー

error C3867 関数呼び出しには引数リスト

VS2008 VC++ 環境にて、コンパイルで、「error C3867: 'CFrrjiftestDlg::MyDataHandler': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&CFrrjiftestDlg::MyDataHandler' を使用してください」 が発生しました。ネットで類似のエラーを見ましたが、エラーは回避できませんでした。どうすれば、エラーが直るのか教えてください。 【エラー箇所のソース】 void CFrrjiftestDlg::OnBnClickedButton1()      ← このソースは、frrjiftestDlg.cpp で記述 #include "frrjiftestDlg.h"         この間にいろいろな処理を記述 Cortex_SetDataHandlerFunc(MyDataHandler);   ← この行でエラー発生 【frrjiftestDlg.h のヘッダ】  void MyDataHandler(sFrameOfData* FrameOfData); ← これを記述 【MyDataHandler の記述】 void CFrrjiftestDlg::MyDataHandler(sFrameOfData* FrameOfData)  ← これは、frrjiftestDlg.cpp で記述  この後に処理を記述 ざっと、こんな感じで書いています。 エラーの説明をみると、「メンバへのポインタを作成するために '&CFrrjiftestDlg::MyDataHandler' を使用してください」となっていますが、いろいろ書いてみましたが、だめでした。

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

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

いや、だから、 Cortex_SetDataHandlerFunc() の引数にはメンバ関数を渡せないんじゃないですか? 通常の関数とメンバ関数は互換ではありませんよ?

ichigo61
質問者

お礼

ご指摘ありがとうございました。 通常の関数に変更したら、コンパイルエラーは直りました。

その他の回答 (2)

回答No.2

> Cortex_SetDataHandlerFunc(&CFrrjiftestDlg::MyDataHandler); ←これにすると、 > > C2664: 'Cortex_SetDataHandlerFunc' : 1 番目の引数を 'void (__thiscall CFrrjiftestDlg::* )(sFrameOfData *)' から 'void (__cdecl *)(sFrameOfData *)' に変換できません ←このえらーになります。 Cortex_SetDataHandlerFunc() の引数にはメンバ関数を渡せないんじゃないですか? 通常の関数とメンバ関数は互換ではありませんよ?

ichigo61
質問者

補足

もう少し説明しますと、 // frrjiftestDlg.h : header file class CFrrjiftestDlg : public CDialog { public: void PrintFrameOfData(FILE *handle, sFrameOfData *FrameOfData); void MyDataHandler(sFrameOfData* FrameOfData); }; // frrjiftestDlg.cpp : implementation file void CFrrjiftestDlg::MyDataHandler(sFrameOfData* FrameOfData) { PrintFrameOfData(handle, FrameOfData); } void CFrrjiftestDlg::PrintFrameOfData(FILE *handle, sFrameOfData *FrameOfData) { いろんな処理 } void CFrrjiftestDlg::OnBnClickedButton1() { //ここがメイン処理のボタンを押下したときの処理 Cortex_SetDataHandlerFunc(MyDataHandler); ←ここがコンパイルエラー } error C3867: 'CFrrjiftestDlg::MyDataHandler': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&CFrrjiftestDlg::MyDataHandler' を使用してください ↑このエラーになります。 下記の記述にすると、それぞれのエラーになります。 //Cortex_SetDataHandlerFunc(&CFrrjiftestDlg::MyDataHandler); /* C2664 ERROR */ //Cortex_SetDataHandlerFunc(&MyDataHandler); /* C2276 ERROR */ どんな記述にすれば、いいのでしょうか?

回答No.1

> エラーの説明をみると、「メンバへのポインタを作成するために '&CFrrjiftestDlg::MyDataHandler' を使用してください」となっていますが、いろいろ書いてみましたが、だめでした。 "だめ"とは? > Cortex_SetDataHandlerFunc(MyDataHandler);   ← この行でエラー発生 これを Cortex_SetDataHandlerFunc(&CFrrjiftestDlg::MyDataHandler); あるいは Cortex_SetDataHandlerFunc(&MyDataHandler); としてもだめだったのですか? どう"だめ"なのですか?

ichigo61
質問者

補足

Cortex_SetDataHandlerFunc(&MyDataHandler); ←これにすると、 error C2276: '&' : 仮想関数のアドレスを取ろうとしました。 ←このエラーになり、 Cortex_SetDataHandlerFunc(&CFrrjiftestDlg::MyDataHandler); ←これにすると、 C2664: 'Cortex_SetDataHandlerFunc' : 1 番目の引数を 'void (__thiscall CFrrjiftestDlg::* )(sFrameOfData *)' から 'void (__cdecl *)(sFrameOfData *)' に変換できません ←このえらーになります。

関連するQ&A

  • 静的でないメンバ関数の呼び出しが正しくありません

    コンパイル時に「静的でないメンバ関数の呼び出しが正しくありません」となってしまいます。 普通の関数からメンバー関数を呼び出すには、どう記述すればいいのでしょうか? void MyDataHandler(sFrameOfData* FrameOfData) { CFrrjiftestDlg::sndrobot();  ← ここがコンパイルエラー } void CFrrjiftestDlg::sndrobot() { いろいろ記述 } //*** 以下、ヘッダー class CFrrjiftestDlg : public CDialog { DECLARE_DYNAMIC(CFrrjiftestDlg); friend class CFrrjiftestDlgAutoProxy; // Construction public: CFrrjiftestDlg(CWnd* pParent = NULL); // standard constructor virtual ~CFrrjiftestDlg(); void msubInit(); void sndrobot();   ←ここで宣言 };

  • C++のファイル分割でのエラーについて

    最近VC2008でC++の勉強を始めたのですが、ファイル分割でLNK2005エラーというのが発生し、解消できません。 インクルードガードは行ったのですが、どうしたらよいのか分かりません。 ソースコードはこんな感じです。 //main.cpp #include "sub.h" #include "res.h" bool main(){ calcx(m_x); calcy(m_y); } //res.h 共有変数の宣言 #ifndef __RES_H #define __RES_H int m_x; int m_y; #endif //sub.h 関数のプロトタイプ宣言を行う void calcx(); void calcy(); //sub.cpp 関数の定義を記述する #include "res.h" void calcx(int x){ m_x = x + 100; } void calcy(int y){ m_y = y + 200; } エラー: 1>Main.obj : error LNK2005: "int m_x" (?m_x@@3HA) は既に sub.obj で定義されています。 1>Main.obj : error LNK2005: "int m_y" (?m_y@@3HA) は既に sub.obj で定義されています。 上記のようなエラーを解消するにはどうしたら良いのでしょうか。 何がおかしいのか指摘をお願いします。

  • 【VS2008 C++】2つのプロジェクト間で共通の関数を使いたい

    【VS2008 C++】2つのプロジェクト間で共通の関数を使いたい WindowsXP上で visual studio 2008 C++ express editionを 使用しています。 1つのソリューションに2つのプロジェクトをつくり、 その2つに共通の関数を使用させたいのですが、どのように 設定すればよいか教えて頂けませんでしょうか。 ソースの内容は以下のとおりです。 具体的には、mainB.cppでcommon.cppの関数を 呼び出したいです。 //common.cpp #include <stdio.h> void showCommon(){ printf("---common-----\n"); } //common.h #include<stdio.h> void showCommon(); //mainA.cpp #include<stdio.h> #include "common.h" void main(){ printf("---mainA-----\n"); showCommon(); } //mainB.cpp #include<stdio.h> #include "common.h" void main(){ printf("---mainB-----\n"); showCommon(); }

  • 関数へ引数を渡す時・・・(C言語)

    Cを始めたばかりです。 レベルの低い質問だと思いますがお願いします。 【ソース】 /* a1.c */ #include <stdio.h> void aaa(char); int main( int argc, char *argv[] ) { char box[] = "test"; aaa(box); return 0; } /* a2.c */ #include <stdio.h> void aaa(char box) { printf( "%s",box ); } 【質問】 変数boxの中身を関数aaaに渡したいだけですが、 上記ソースをコンパイルすると、a1.cの aaa(box) の部分でエラーが出てしまいます。 どうもデータ型(ポインタ?)がまずいようですが、 何が問題なのでしょうか? 御回答宜しくお願い致します。

  • 関数呼び出しについて質問です

    関数呼び出しについて質問です 私は今以下の様なプログラムを作成し実行しました #include <stdio.h> int i = 1; void infinity(void) { printf("%010d\n",i++); infinity(); } void main() { infinity(); } 関数を無限に呼び出すプログラムです 私が使っているパソコンでは4721回関数呼び出しができました そこで質問なのですが 1関数呼び出しは有限回であることがわかったが他のパソコンと比べるとどのくらいの差になるのか? 2関数呼び出し回数の上限は何によって(OS、ソフト)決められているのか? この2つお願いします

  • 引数について(C言語)

    あるサイトでこんなソースを見たのですが、 void func(val) int val; { /*処理*/ } この引数の記述方法はどうなっているのでしょうか?回答よろしくお願いします。

  • bsearch関数の呼び出しで

    C言語の深いところまで理解しようとしてます。今まで使わないだろうと思っていた関数へのポインタ なのですが、 2分探索のところで bsearch関数というのが出てきました。 この関数は第5引数に比較関数を引数にするのですが p = bsearch(&ky, x, nx, sizeof(int), (int (*)(const void *,const void *))int_cmp ); という形でサンプルソースには載っています。 この (int (*)(const void *,const void *))int_cmp の部分なのですが、まず戻り値をキャストするなら int (*)ではなく(int *)ではないでしょうか。 それとint_cmpは比較関数なのですが、引数が左側に来る、というところが納得できません。 ちなみにソースファイルをcppのままだとコンパイルできませんでした.cに拡張子を直したらコンパイルできました。 説明が足りないところがあったら指摘してください。お願いします。

  • 通常関数とメンバー関数のやりとりでコンパイルエラー

    下記にあるようなプログラムをコンパイルしたら、下記のエラーになりました。 どこに問題があるのでしょうか? 「error C2227: '->SetValueXyzwpr2' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。」 //frrjif.h class _DataPosReg : public COleDispatchDriver { // Operations public: BOOL SetValueXyzwpr2(long Index, float X, float Y, float Z, float W, float P, float R, float E1, float E2, float E3, short C1, short C2, short C3, short C4, short C5, short C6, short C7, short UF, short UT); }; //frrjiftestDlg.h #include "frrjif.h" class CFrrjiftestDlg : public CDialog { public: CFrrjiftestDlg(CWnd* pParent = NULL); // standard constructor virtual ~CFrrjiftestDlg(); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation _Core *pCore; _DataPosRegXyzwpr *pPosRegXyzwpr; _DataSysVarPos *pSysVarPos; }; //frrjiftestDlg.cpp #include "frrjiftestDlg.h" void MyDataHandler(sFrameOfData* FrameOfData) { CFrrjiftestDlg::pSysVarPos->SetValueXyzwpr2(X,Y,Z,W,P,R,E1,E2,E3,C1,C2,C3,C4,C5,C6,C7,UF,UT); //↑ここでコンパイルエラー //↑error C2227: '->SetValueXyzwpr2' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 } void CFrrjiftestDlg::OnBnClickedButton1() { Cortex_SetDataHandlerFunc(MyDataHandler); }

  • クラスのメンバ関数の呼出しについて

    こんにちは。 初心者ですが、よろしくお願いします。 MFCを使用してダイアログベースのアプリケーションを作成しています。 <ヘッダ> class Sample : public CDialog { (略) public: int SampleA(CString); (略) <ソース> UINT SampleB(LPVOID pParam) { int n; n = Sample::SampleA(CStringA) ←エラー return 0; } メンバ関数ではない、SampleBから、上記のように呼出すと、「静的でないメンバ関数の中で呼び出しが正しくありません。」というエラーが表示されてしまいます。 ヘッダ内のメンバ関数宣言をstaticにすれば問題は解決できるのですが、このやり方しかないのでしょうか。 よろしくお願いします。

  • 他の.CPPファイルに定義した関数を呼び出す方法について

    新規作成したプロジェクトに、 以前自分が作成した.cppファイルと.hファイルを そのまま使えないかと考えています。 (※仮にそのファイルの名前を "define.cpp" "define.h" とします) プロジェクトに新規ファイル main.cpp を作成して、 define.hをインクルードし、 以下のようなテストのプログラムを組みました。 ・../util/define.cpp---------------------- #include <iostream> #include "define.h" void test(){ std::cout<<"test."<<std::endl; } ・../util/define.h------------------------ #pragma once void test(); ・main.cpp---------------------------- #include "../util/define.h" int main(){  test();  return 0; } 上記のソースを VisualC++7.0 でビルドすると、 main.cppの3行目で以下のようなエラーが出ました。 > LNK2019: 未解決の外部シンボル "void __cdecl test(void)" が関数 _main で参照されました VisualC++で「既存項目の追加」という項目より、 実体の定義されたdefine.cppをプロジェクトに追加していないため 当然といえば当然なのですが・・・ C言語でいうところの<stdio.h>等みたいに、 わざわざプロジェクトにCPPファイルを追加しなくても 関数を呼び出せるようには出来ないのでしょうか? 全ての関数と処理をヘッダーファイルに記述すると解決ですが 物凄く見辛いのでそれは避けたいのです。 また、色々なPC間で使っているため(学校のPCなので)、 ツール自体のプロパティを弄らない方法があるのでしたら、 多少面倒でもそちらの方が好ましいです。 追加する方法があるかどうか、 あればその方法をご存じでしたら教えていただければ嬉しいです。 よろしくお願いします。