当您收到类声明的编译错误“看起来像函数定义”时,这意味着啥?

Posted

技术标签:

【中文标题】当您收到类声明的编译错误“看起来像函数定义”时,这意味着啥?【英文标题】:What does it mean when you get a compile error "looks like a function definition" for a class declaration?当您收到类声明的编译错误“看起来像函数定义”时,这意味着什么? 【发布时间】:2009-03-26 06:25:16 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您几乎肯定错过了定义AFX_BASE_APPLICATION_APP_CLASS 的标题。在这种情况下,它会原封不动地通过,VC++ 会假定CFileExtension 是一个返回class AFX_BASE_APPLICATION_APP_CLASS 的函数。

而且,既然它认为它是一个函数,它也认为它需要括号。

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

【讨论】:

遇到了同样的问题,已经解决了。【参考方案2】:

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

我的代码是这样的:

int MyClass:doSomething() 


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

int MyClass::doSomething() 


【讨论】:

这也是我的问题 - 在 VS2010“混合模式”中,没有智能感知可以帮助您!【参考方案3】:

...以及答案,因为我懒得登录这些论坛,但我已经有一个 OpenID :-)

在我的情况下(可能是我找到的所有情况),问题是我缺少一个 #include 用于包含类名之前的宏定义的头文件。该宏最有可能用作打开 __declspec(dllexport) 的构建配置切换方式。

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

【讨论】:

Tim 是正确的,我刚刚遇到了这个错误,我错过了一个预处理器定义,它会在类名之前定义宏。一旦定义了宏,错误就解决了......坦率地说,我打算投票给 Tim 的答案,但发现我的 Rep 分数不够高 :-) EB【参考方案4】:

只需定义AFX_BASE_APPLICATION_APP_CLASS

【讨论】:

【参考方案5】:

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

如果你把它弄混了,你的班级也可能无法得到这样的认可,你会得到同样的错误。

【讨论】:

【参考方案6】:

我遇到了同样的问题,但没有一个解决方案有效。 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 &lt;afx.h&gt; 到 stdafx.h(我在第一个包含之前将它包含在右上角)。

现在重新引导、清理和构建错误应该会消失。

没有其他方法可以从项目设置中更改此选项。此选项不同于 Project Properties >> Configuration Properties >> General >> 'Use of MFC'

更新

UseOfMFC="2" 技巧可能在其他地方有用,但显然如果您只是 #include &lt;afx.h&gt; 并将设置 project properties &gt;&gt; General &gt;&gt; '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",所以这是正确的方法。

【讨论】:

以上是关于当您收到类声明的编译错误“看起来像函数定义”时,这意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用@testable时,“模块未编译用于测试”

类方法和具有相同名称的变量,C ++中的编译错误不在Java中?

在我将编译器设置设置为支持 c++11 后,我仍然收到错误“stoi”未声明。为啥? [复制]

为啥我在写 = 而不是 == 时没有收到警告?

Notepad ++中的多类

.NET System.Process:当您重定向 StandardError 时,控制台窗口不会收到任何输出