簡體   English   中英

Derived1::Base 和 Derived2::Base 是指同一個類型嗎?

[英]Do Derived1::Base and Derived2::Base refer to the same type?

MSVC、Clang 和 GCC 不同意此代碼:

struct Base { int x; };
struct Der1 : public  Base {};
struct Der2 : public  Base {};

struct AllDer : public Der1, public Der2 {
    void foo() {
        Der1::Base::x = 5;
    }
};

神螺栓

GCC:

<source>: In member function 'void AllDer::foo()':    
<source>:10:21: error: 'Base' is an ambiguous base of 'AllDer'    
   10 |         Der1::Base::x = 5;    
      |                     ^    
Compiler returned: 1

Clang 給出了類似的錯誤,MSVC 沒有給出錯誤。

誰在這里?

我想這在[class.member.lookup]中有所涉及,但我很難理解它試圖告訴我這個案例的內容。 請引用相關部分,並盡可能用簡單的英語解釋。

PS:受這個問題的啟發, 為什么對 Base Class 的引用與:: -operator troughderived class 不明確?

PPS:實際上我的疑問是Der1::Base是指類型,即Base (然后Der2::Base是完全相同的類型),還是子對象。 我確信它是第一個,但如果是后者,那么 MSVC 將是正確的。

要回答標題中的問題,是的, Derived1::Base引用了注入的類名[class.pre] BaseDerived2::Base也是如此。 兩者均指 class ::Base

現在,如果Base有一個static成員x ,那么Base::x的查找將是明確的。 只有一個。

這個例子中的問題是x是一個非靜態成員,而AllDer兩個這樣的成員。 您可以通過指定只有一個x成員的AllDer明確基礎 class 來消除對x的訪問的歧義。 Derived1是一個明確的基礎 class,它有一個x成員,因此Derived1::x明確指定AllDer中的兩個x成員中的哪一個。 Base也只有一個x成員,但它不是AllDer的明確基數。 AllDer的每個實例都有兩個Base類型的子對象。 因此Base::x在您的示例中不明確。 而且由於Derived1::Base只是Base的另一個名稱,這仍然是模棱兩可的。

[class.member.lookup] 指定在嵌套名稱說明符的上下文中查找x ,因此必須首先解決。 我們確實在尋找Base::x ,而不是Derived1::x ,因為我們首先將Derived1::Base解析為Base 這部分成功了, Base.中只有一個x [class.member.lookup] 中的注釋 12 明確告訴您,當有多個具有相同名稱的子對象時,使用明確的名稱查找可能仍會失敗。 該示例中的D::i基本上是您的Base::x

您可以將 class 名稱作為 class 的成員引用的原因是因為 cpp 為方便使用起別名,就像您using Base =::Base;編寫的一樣。 基地內。
您面臨的問題是Der1::BaseBase
因此,當您編寫Der1::Base::x時,它與Base::x相同。

暫無
暫無

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

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