当您收到类声明的编译错误“看起来像函数定义”时,这意味着啥?
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 <afx.h>
到 stdafx.h(我在第一个包含之前将它包含在右上角)。
现在重新引导、清理和构建错误应该会消失。
没有其他方法可以从项目设置中更改此选项。此选项不同于 Project Properties >> Configuration Properties >> General >> 'Use of MFC'。
更新
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"
,所以这是正确的方法。
【讨论】:
以上是关于当您收到类声明的编译错误“看起来像函数定义”时,这意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章
类方法和具有相同名称的变量,C ++中的编译错误不在Java中?