質問

struct B1{
  int d;
  void fb(){};
};

struct B2 : B1{
  using B1::d;
  using B1::fb;

  int d;               // why this gives error?
  void fb(){}          // and this does not?
};

int main(){}

なぜなら、 B1::fb() として扱われます B1::fb(B1*) and B2::fb() 扱われた B2::fb(B2*)?つまり、暗黙のパラメーターは、これらを区別するのに役立ちますか?

$13.3.1/4-

派生クラスに使用することによって導入された非相続関数の場合、関数は、暗黙的オブジェクトパラメーターのタイプを定義する目的で派生クラスのメンバーであると見なされます。

役に立ちましたか?

解決

C ++標準(C ++03§7.3.3/12)が説明します。

a 使用を使用します ベースクラスの名前を派生クラスの範囲に、派生クラスのメンバー関数をオーバーライドし、/またはベースクラスの同じ名前とパラメータータイプでメンバー関数を非表示にします(矛盾するのではなく)。

あなたの例では、 B2::fb() 隠します B1::fb() 使用宣言によって導入されました。

両方を持っていることが不運である理由について using B1::d;int d; の定義で B2, 、C ++標準(C ++03§7.3.3/10)が説明します。

a以来 使用を使用します 宣言であり、同じ宣言地域の同じ名前の宣言の制限も適用されます 使用を使用します。

したがって、以下が不正に形成されているのと同じ理由で、それは不調です。それは、単一の宣言領域で同じ名前を持つ2つのオブジェクトになります。

struct S { int d; int d; };
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top