4

$ 7.3.3 / 14(C ++ 03)

struct A { int x(); };
struct B : A { };
struct C : A {
   using A::x;
   int x(int);
};
struct D : B, C {
   using C::x;
   int x(double);
};
int f(D* d) {
   return d->x(); // ambiguous: B::x or C::x
}

'f'のコードのコメントは、'B::x'と'C::x'の間のあいまいさが予想されることを示しています。

ただし、g ++(ideone)またはComeauを使用してコンパイルすると、エラーはわずかに異なります。B::xまたはC::xのあいまいさを示す代わりに、これらのエラーは、AがDのあいまいなベースであるという事実を示します。

prog.cpp:関数内'int f(D *)':prog.cpp:16:エラー:'A'は'D'のあいまいなベースです</p>

"ComeauTest.c"、21行目:エラー:基本クラス"A"はあいまいですreturnd-> x(); //あいまい:B::xまたはC::x

$ 10.2の名前検索ルールを見ると、コードスニペットのコメントが実際には正しくないように感じます。エラーは、実際、何よりもまず、基本クラス「A」のあいまいさに関連しています(たとえば、過負荷解決のあいまいさ)。何かご意見は?

4

2 に答える 2

2

これは、C ++ 03での名前検索のねじれが原因です。明確なサブオブジェクトのチェックは、C++03でのクラスメンバー名検索の一部でした。C ++ 03でルックアップすると、D::XとC::xおよびA::xが見つかります。ここで、A :: xは一致しますが、タイプAの2つの異なるサブオブジェクトに関連付けられています。

C ++ 0xでは、明確なサブオブジェクトのチェックがそれぞれのサブ句の一部になりました。DR#39を参照してください。直接のメンバーであるクラスxはあいまいなベースです。したがって、句5では、句ではなくコンパイルエラーが発生します。 10.10。

コメントはのサブオブジェクトについて説明していることに注意してくださいA。パスを通過するサブオブジェクトが1つありA、パスを通過するサブオブジェクトがBもう1つありAますC。これがコメントに「B::xまたはC::x」と書かれている理由です。同じクラスタイプの複数のサブオブジェクトの存在は、アクセシビリティの問題を無視して、そのクラスタイプに変換しようとするだけで判断できます。変換があいまいな場合、サブオブジェクトは複数回出現します。

于 2010-11-09T07:07:21.823 に答える
0

Clang ++は、g++とComeauによって生成されたエラーの組み合わせをいくらか提供します

C:\Users\SUPER USER\Desktop>clang++ chubsdad.cpp
chubsdad.cpp(12) :  error: ambiguous conversion from derived class 'D' to base class
      'A':
    struct D -> struct B -> struct A
    struct D -> struct C -> struct A
   return d->x(); // ambiguous: B::x or C::x
          ^
1 error generated.
于 2010-11-09T04:49:31.697 に答える