[英]Enum Members conflict with class names
我最近在做一個小項目時產生了一系列錯誤。 基本上是導致它的代碼:
#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);
}
}
產生此編譯器錯誤:
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);
該修復程序是在新代碼后添加class關鍵字:
std::unique_ptr<A> myb(new class B);
現在,該枚舉已包含在原始代碼中的abstact類的頭文件中(這使得它更加難以發現),但不要緊記; 我從未想過,枚舉的成員會導致實例創建失敗。 從字面上看,我花了幾個小時才能找到該錯誤。 誰能向我解釋為什么會這樣? 枚舉對new有意義嗎?
PS:該錯誤是由使用clang並建議class關鍵字的同事發現的。 如您所見,我的Ubuntu上的標准c ++編譯器不是。
在您的例子B
從enum
隱藏類B
。 該標准的第3.3.10節描述了名稱隱藏的規則:
可以在同一作用域中聲明的變量,數據成員,函數或枚舉器的名稱隱藏類名稱(9.1)或枚舉名稱(7.2)。 如果在相同的作用域(以任何順序)中以相同的名稱聲明了類或枚舉名稱以及變量,數據成員,函數或枚舉器,則無論變量,數據成員,函數或枚舉器名稱可見。
語言設計人員需要設置優先級規則,因此他們決定應該enum
常量名稱。 該規則似乎是任意的,並且可能是按照C標准中的一些舊規則建模的。 但是,它是標准的一部分,因此每個編譯器都必須遵守該標准。
不用說,使類名與enum
成員沖突是一個非常糟糕的主意。 解決此問題的最佳方法是重命名您的班級。
我不確定您在這里還期望什么。
首先,您介紹了名為B
和C
整數常量。 當然,您不能new
這些。 那就像寫new 42
。
然后,您引入了具有相同名稱的類型。 好的,這是允許的,但是要使用它們,您必須像發現的那樣現在將它們稱為class B
class C
和class C
(或struct B
和struct C
)。
不要將相同的名稱用於不同的事物。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.