2009-03-26 19 views
15

この問題が最近発生しました。私は質問をしている人々の多くの例を見つけました— here, for example —しかし、具体的な答えはありません。クラス宣言の「関数定義のように見える」というコンパイルエラーが発生した場合、どういう意味ですか?

ここではそのリンクから掲揚サンプルコードです:

class AFX_BASE_APPLICATION_APP_CLASS CFileExtension 
{ 
public: 
    CFileExtension();   
    virtual ~CFileExtension(); 
}; 

これによって生成されるエラーは以下のとおりです。

c:\FileExtension.h(14) : error C2470: 'CFileExtension' : looks like a function definition, but there is no formal parameter list; skipping apparent body

答えて

38

ほとんどの場合、AFX_BASE_APPLICATION_APP_CLASSを定義するヘッダーが欠落しています。その場合、それは変更されずに通過され、VC++はCFileExtensionclass AFX_BASE_APPLICATION_APP_CLASSを返す関数であると仮定します。

そして、関数だと思うので、括弧が必要だとも考えています。

AFX_BASE_APPLICATION_APP_CLASSが定義されていて、そのファイルが#includeであることがわかります。

+1

同じ問題があって、 。 –

4

...と答え、私は気にすることができませんでしたので、これらのフォーラムのいずれかにログインしてください。私は既にOpenIDを持っていました:-)

私のケースでは(おそらく私が見つけたすべてのもの)、問題は#iが欠けていたことでしたクラス名の前にあるマクロの定義を含むヘッダーファイルをncludeします。このマクロは、__declspec(dllexport)をオンにするビルド構成の切り替え方法として使用される可能性が最も高いです。

私がこれを発見したのは、プロジェクトプロパティ "C/C++"に移動することでした。プリプロセッサを起動し、 "前処理されたファイルを生成する"をオンにします。前処理された出力を見ると、マクロは展開される代わりに逐語的に含まれていることがわかりました。

+0

Timは正しいですが、私はこのエラーに直面していました。クラス名の前にマクロを定義したプリプロセッサ定義が欠落していました。マクロが定義されると、エラーは解決されます... 私はちょうどティムの答えを投票するつもりでしたが、私の担当者のスコアは十分に高くはありませんでした:-) EB – echobravo

3

ちょうど私が同じコンパイラエラーが発生しましたAFX_BASE_APPLICATION_APP_CLASS

6

を定義します。

int MyClass:doSomething() { 

} 

それがされている必要があります: '::'(注記代わりに ':'

int MyClass::doSomething() { 

} 
+1

これは私の問題でした - VS2010の "混合モード"では、あなたを助けるインテリセンスはありません! – Melanie

0

別の可能性のある問題は、行方不明コロン

私のコードのようなものでしたVisual C++で__declspec(dllexport)の代わりに__declspec(dllimport)を使用するか、またはVisual C++でクラス/関数プレフィックスとしてdeclspecを使用しないでください。

thiあなたのクラスもそのように認識されず、同じエラーが発生することがあります。

0

私は同じ問題を抱えていましたが、解決策はありませんでした。 OPに投稿されたような問題は、クラスを含むから来た:

class AFX_EXT_CLASS CMyClass : public CObject 
{ 
public : 
// .... 
} 

これは、私は、コンソールのexeファイルで使用するDLLからエクスポートクラスでした。作成ウィザードで「mfcを使用」としてコンソールアプリケーションを作成すると、この エラーは発生していませんでしたが、そのオプションによってアプリケーションの別の構造が作成されます。

とにかく、さまざまなヘッダーを含めるようにして、AFX_EXT_CLASSが定義されていますが、何も機能しませんでした。簡単に言えば、解決策は、アプリケーションからMFCを使用して、dllからMFCエクスポートされたクラスを理解できるようにすることです。

<Configurations> 
    <Configuration 
     Name="Debug|Win32" 
     OutputDirectory="$(SolutionDir)$(ConfigurationName)" 
     IntermediateDirectory="$(ConfigurationName)" 
     ConfigurationType="1" 
     UseOfMFC="2" <-------------Insert this line here 
     CharacterSet="1" 

また#include <afx.h> STDAFX.H(第1には、前に私は右上でそれを含む):どのように我々はそれを行うことは.vcprojファイルを編集して、以下に示すように、ラインUseOfMFC="2"を挿入することです。

ここでは、エラーを取り除き、エラーを取り除いてください。

このオプションをプロジェクト設定から変更する方法は他にありません。このオプションは、プロジェクトプロパティ>>構成プロパティ>>全般>>「Use of MFC」とは異なります。

更新多分便利な他の場所が、どうやらあなただけ#include <afx.h>、このエラーが消えるよりも、共有DLLでMFCを使用するための設定project properties >> General >> 'Use of MFC'を変更した場合

UseOfMFC="2"トリック。後で設定を変更しない場合はコンパイルエラーが、これは実際にも、プロジェクトファイルにUseOfMFC="2"設定しない変更

c:\program files (x86)\microsoft visual studio 8\vc\atlmfc\include\afx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d] 

を発生しますので、これは正しい方法です。

関連する問題