[英]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] Base
, Derived2::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::Base
是Base
。
因此,當您編寫Der1::Base::x
時,它與Base::x
相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.