当你获得类声明的编译错误“看起来像一个函数定义”时,它意味着什么?

时间:2009-03-26 06:25:17

标签: c++ visual-studio

我最近遇到过这个问题。我发现很多人都在问这个问题 - 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

6 个答案:

答案 0 :(得分:38)

你几乎肯定错过了定义AFX_BASE_APPLICATION_APP_CLASS的标题。在这种情况下,它将通过不变的方式传递,VC ++会认为CFileExtension是一个返回class AFX_BASE_APPLICATION_APP_CLASS的函数。

并且,因为它认为它是一个函数,它也认为它需要括号。

您只需找到AFX_BASE_APPLICATION_APP_CLASS定义的位置和#include该文件。

答案 1 :(得分:6)

我遇到了相同的编译器错误。问题是缺少冒号

我的代码类似于:

int MyClass:doSomething() {

}

应该是:(注意'::'而不是':'

int MyClass::doSomething() {

}

答案 2 :(得分:4)

...和答案,因为我无法为任何这些论坛登录,但我已经有了一个OpenID: - )

在我的情况下(可能是我发现的所有),问题是我错过了包含类名前面的宏定义的头文件的#include。该宏很可能用作构建配置切换方式来打开__declspec(dllexport)。

我发现这一点的方法是进入项目属性“C / C ++”|预处理器并打开“生成预处理文件”。当我查看预处理的输出时,我发现宏是逐字包含的,而不是被扩展。

答案 3 :(得分:3)

只需定义AFX_BASE_APPLICATION_APP_CLASS

答案 4 :(得分:0)

另一个可能的原因是在Visual C ++中使用__declspec(dllimport)而不是__declspec(dllexport)或者根本没有使用declspec作为类/函数前缀。

如果你混淆了这一点,那么你的课程也可能无法被识别,你也会得到同样的错误。

答案 5 :(得分:0)

我遇到了同样的问题,没有一个解决方案有效。 OP中发布的问题来自于包括类:

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

这是我想在控制台exe中使用的dll的导出类。如果我创建控制台应用程序为'使用mfc'在创建向导中,然后这个 错误没有发生,但该选项导致创建不同的应用程序结构。

无论如何我试图包含各种标题,因此它知道AFX_EXT_CLASS,定义它但没有任何效果。简而言之,解决方案是我们必须启用MFC应用程序才能从dll中了解MFC导出的类。我们如何操作是通过编辑.vcproj文件并插入行UseOfMFC="2",如下所示:

<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(我在第一次包含之前将其包含在右上角)。

现在重新添加,清理并构建错误应该消失。

没有其他方法可以从项目设置中更改此选项。此选项不同于项目属性&gt;&gt;配置属性&gt;&gt;一般&gt;&gt; &#39;使用MFC&#39;

<强>更新

UseOfMFC="2"技巧可能在其他地方很有用,但显然如果你只是#include <afx.h>并将设置project properties >> General >> 'Use of MFC'更改为在共享dll中使用MFC,那么这个错误就会消失。如果您没有更改以后的设置,则会发生编译错误

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]

更改它实际上也会在项目文件中设置UseOfMFC="2",所以这是正确的方法。