私はこのコード(ダイヤモンドの問題を)持っている:ダイヤモンド(C++)
#include <iostream>
using namespace std;
struct Top
{
void print() { cout << "Top::print()" << endl; }
};
struct Right : Top
{
void print() { cout << "Right::print()" << endl; }
};
struct Left : Top
{
void print() { cout << "Left::print()" << endl; }
};
struct Bottom: Right, Left{};
int main()
{
Bottom b;
b.Right::Top::print();
}
私はTop
クラスでprint()
を呼びたいです。
コンパイルしようとするとエラーが表示されます:'Top' is an ambiguous base of 'Bottom'
この行に:b.Right::Top::print();
なぜ曖昧ですか?私は、Top
をRight
から、Left
にではなく明示的に指定しました。
私はそれを行う方法を知りたくありません。はい、参照、仮想継承などで行うことができます。私はちょうどb.Right::Top::print();
があいまいであることを知りたいと思います。
これは暗黙の "this->"を含むクラスメンバアクセス演算子が非静的データメンバまたは非静的メンバ関数にアクセスするために使用された場合、参照が不正である左のオペランド( "。オペレータの場合)は、右オペランド "*、11.2p6の命名クラスへのポインタに暗黙的に変換することはできません。命名クラスは' A'ですが、 'D *'は暗黙的に 'A *'に変換できません。 –
ここでのセマンティクスは、 'B :: A :: tell'を使ってどの関数を呼び出すかを教えてくれることです。あなたは' D :: tell'を使ってコンパイラを助けます。サブオブジェクトを指定する必要はありません - それは2つの選択肢があります: 'B 'または' C'を介して 'A'への道を進み、エラーを返します。 –
2つの"主要な "あいまいチェックがあります5.2.5p5にあるものと、11.2p6でここに噛み付くものです。5.2.5p5のものは、すべてのtell関数を削除する場合は 'd.tell()'を拒否します'A'の名前を除いて' D'であるが、 'tell'は' A'の直接のメンバーになり、 'A'はあいまいです。' DB :: A :: tell() '、それは5.2.5p5で整形式ですしかし、11.2p6では不調に終わった。これらのチェックはお互いを補完するものであり、タイプシステムで適切に動作するために重要です。 –