web-dev-qa-db-ja.com

Derived1 :: BaseとDerived2 :: Baseは同じ型を参照していますか?

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:この質問に触発されました ベースクラスへの参照が::-演算子トラフ派生クラスで曖昧なのはなぜですか?

PPS:実際、私の疑問はDer1::Baseはタイプを参照し、それはBaseになります(そしてDer2::Baseは完全に同じタイプです)、またはサブオブジェクトに。私はそれが最初のものであると確信していますが、もしそれが後者であるならば、MSVCは正しいでしょう。

15

クラスのメンバーとしてクラス名を参照できるのは、cppがBase内にusing Base = ::Base;を書いたかのように、便利に使用できるようにエイリアスを付けるからです。
あなたが直面している問題は、Der1::BaseBaseであることです。
したがって、Der1::Base::xと書くと、Base::xと同じになります。

2
Dani