簡體   English   中英

枚舉成員與類名沖突

[英]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 ++編譯器不是。

在您的例子Benum隱藏類B 該標准的第3.3.10節描述了名稱隱藏的規則:

可以在同一作用域中聲明的變量,數據成員,函數或枚舉器的名稱隱藏類名稱(9.1)或枚舉名稱(7.2)。 如果在相同的作用域(以任何順序)中以相同的名稱聲明了類或枚舉名稱以及變量,數據成員,函數或枚舉器,則無論變量,數據成員,函數或枚舉器名稱可見。

語言設計人員需要設置優先級規則,因此他們決定應該enum常量名稱。 該規則似乎是任意的,並且可能是按照C標准中的一些舊規則建模的。 但是,它是標准的一部分,因此每個編譯器都必須遵守該標准。

不用說,使類名與enum成員沖突是一個非常糟糕的主意。 解決此問題的最佳方法是重命名您的班級。

我不確定您在這里還期望什么。

首先,您介紹了名為BC整數常量。 當然,您不能new這些。 那就像寫new 42

然后,您引入了具有相同名稱的類型。 好的,這是允許的,但是要使用它們,您必須像發現的那樣現在將它們稱為class B class Cclass C (或struct Bstruct C )。

不要將相同的名稱用於不同的事物。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM