11

私はダイヤモンドの問題に遭遇し、単一のダイヤモンドを使用したさまざまなケースでさまざまな解決策を見つけました。しかし、私は「連鎖」ダイヤモンドの解決策を見つけることができませんでした。

構造によると:はい、私は毎回複数のベースクラスを持ちたいので、仮想継承は解決策ではありません(それはダイヤモンドと呼ばれることさえありますか?)。また、ダイヤモンドのすべての中間層のget/set-functionsを避けたかったのです。

p   p
|   |
k   k
 \ /
  s

class parent { int val; };
class kid1 : public parent {};
class kid2 : public parent {};
class school : public kid1, public kid2 {};

親クラスのvalへのアクセスは、次のように機能するようになりました。

school* s = new school;
s->kid1::val=1; // works

しかし、次の「連鎖」ダイヤモンドについてはどうでしょうか。

p   p   p   p
|   |   |   |
k   k   k   k
 \ /     \ /
  s       s
  |       |
  c       c
    \   /
      w

class country1 : public school {};
class country2 : public school {};
class world : public country1, public country2 {};

経由でvalにアクセスする:

world* w = new world;
w->country1::kid1::val=1; // error

結果:

error: ‘kid1’ is an ambiguous base of ‘world’

なんで?値へのルートが明確に定義されていませんか?

4

2 に答える 2

3

s->kid1::val「サブオブジェクトvalから」という意味ではありません。kid1これは、それを含むタイプ(サブオブジェクトではない)によって修飾された名前にすぎません。

なぜ受け入れられるのかはまったくわかりませんcountry1::kid1が、どうやらそれはのtypedefです::kid1。両方の2つのデータメンバーworldは修飾名を持ってい::kid1::valます。

あなたが欲しいものは:

world* w = new world;
country1* const c1 = world;
c1->kid1::val = 1;
于 2011-03-18T14:31:44.420 に答える
1

です。このエラーは、コンパイラのバグが原因です。

于 2011-03-18T17:43:48.247 に答える