9
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-

using 宣言によって派生クラスに導入された非変換関数の場合、暗黙的なオブジェクト パラメーターの型を定義する目的で、関数は派生クラスのメンバーと見なされます。

4

1 に答える 1

12

C++ 標準 (C++03 §7.3.3/12) では、次のように説明されています。

using 宣言によって、基本クラスの名前が派生クラスのスコープに持ち込まれると、派生クラスのメンバー関数は、基本クラスの同じ名前とパラメーターの型を持つメンバー関数をオーバーライドおよび/または非表示にします (競合するのではなく)。

あなたの例では、 using 宣言によって導入されたものをB2::fb()非表示にします。B1::fb()

の定義でusing B1::d;との両方を使用するのが不適切な理由については、C++ 標準 (C++03 §7.3.3/10) で次のように説明されています。int d;B2

using 宣言は宣言であるため、同じ宣言領域内の同じ名前の宣言に対する制限は、using 宣言にも適用されます

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

struct S { int d; int d; };
于 2010-08-23T04:53:42.693 に答える