当我看到这段代码时,我浏览了wxWidgets的来源
class WXDLLIMPEXP_FWD_CORE wxKeyEvent;
在此之后,他们定义了一个类似
的类class WXDLLIMPEXP_FWD_CORE wxKeyEvent : public wxEvent{
//some code
};
正如你所看到的那样,有一个空格,但在命名类时你不能拥有它,我进一步编写了这个编译成功的小代码`
#include <bits/stdc++.h>
using namespace std;
class a
{
public:
int x;
};
class a b
{
// it fails if i add anything there
};
int main()
{
return 0;
}
当我在class a b中添加一些东西时,这无法编译。你能告诉我发生了什么事吗?
谢谢!
答案 0 :(得分:6)
WXDLLIMPEXP_FWD_CORE
是一个宏,应该添加(编译器特定的)类属性,并扩展为__declspec(dllexport)
或__declspec(dllimport)
,具体取决于用于导出或导入类。
您的示例class a b { /* ... */ };
只是无效的语法,
类名不能包含空格。
答案 1 :(得分:1)
对于宏定义,已接受的答案是正确的,但对于&#34;无效语法&#34;也会产生误导。
如果您的编译器支持uniform initialization, class a b { /* ... */ };
实际上是有效的语法。在您提供的代码中,它会导致使用默认构造函数在全局命名空间中构造名为a
的{{1}}类型的变量。在这种情况下,b
关键字的作用类似于class
,即使没有它,代码也应该编译。
当您尝试在括号内定义变量时,它会停止编译,因为统一初始化语法需要放置构造函数调用参数。