jaa*_*aaq 0 c++ enums class derived abstract
我最近在处理一个小项目时产生了一系列错误的错误.这基本上是导致它的代码:
#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 ++编译器没有...
在您的示例中B
来自enum
隐藏类B
.标准的第3.3.10节描述了名称隐藏的规则:
类名(9.1)或枚举名(7.2)可以通过在同一范围内声明的变量,数据成员,函数或枚举器的名称隐藏.如果类或枚举名称和变量,数据成员,函数或枚举器在同一作用域(按任何顺序)中声明具有相同名称,则类或枚举名称将隐藏在变量,数据成员,函数或枚举器名称可见.
语言设计者需要设置优先级规则,因此他们认为enum
常量名称应该获胜.这条规则似乎是随意的,可能是在C标准中的一些旧规则之后建模的.但是,它是标准的一部分,因此每个编译器都必须遵守它.
不用说,让一个类名与一个enum
成员发生冲突是一个非常糟糕的主意.解决此问题的最佳方法是重命名您的课程.