在C++中,之间有什么区别:
struct Foo { ... };
Run Code Online (Sandbox Code Playgroud)
和
typedef struct { ... } Foo;
Run Code Online (Sandbox Code Playgroud) 我在头文件中找到了以下代码,而“BOOT”类在另一个头文件中定义。
class BOOT* boot(void);
Run Code Online (Sandbox Code Playgroud)
它看起来像一个函数的声明,但它以class.
我最近在处理一个小项目时产生了一系列错误的错误.这基本上是导致它的代码:
#include <memory>
enum derivedtype {B, C};
//abstract class
class A{};
class B : public A
{};
class C : public A
{};
int main()
{
{
std::unique_ptr<A> myb(new B);
std::unique_ptr<A> myc(new C);
}
}
Run Code Online (Sandbox Code Playgroud)
这产生了这个编译错误:
enumclasserror.cpp: In function ‘int main()’:
enumclasserror.cpp:15:30: error: ‘B’ does not name a type
std::unique_ptr<A> myb(new B);
^
enumclasserror.cpp:16:30: error: ‘C’ does not name a type
std::unique_ptr<A> myc(new C);
Run Code Online (Sandbox Code Playgroud)
修复是在新的后添加class关键字:
std::unique_ptr<A> myb(new class B);
Run Code Online (Sandbox Code Playgroud)
现在,枚举被包含在原始代码中的abstact类的头文件中(这使得它更难以发现),但是从未明白过; 我原本无法想象枚举的成员会导致实例的创建失败.它花了我几个小时来找到那个bug.任何人都可以向我解释为什么会这样吗?新的内容对枚举有意义吗?
PS:这个错误是由一个使用clang的同事发现的,它提出了class关键字.正如你所看到的,我的Ubuntu上的标准c ++编译器没有...